Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

kueri oracle untuk mengelompokkan perbedaan tanggal berdasarkan jam

Pada dasarnya, untuk menyelesaikan ini, Anda hanya perlu daftar angka.

with nums as (
      select 0.0 as n from dual
      union all
      select n + 1
      from nums
      where n < 100
    )
select trunc(t.startdate + n * 1/ 24, 'hh'),
       sum((case when trunc(t.startdate + n * 1/24, 'hh') = trunc(t.startdate, 'hh')
                 then 60 - extract(minute from startdate)
                 else 0
            end) +
           (case when trunc(t.startdate + n * 1/24, 'hh') > trunc(t.startdate, 'hh') and
                      trunc(t.startdate + n * 1/24, 'hh') < trunc(t.enddate, 'hh')
                 then 60
                 else 0
            end) +
           (case when trunc(t.startdate + n * 1/24, 'hh') = trunc(t.enddate, 'hh')
                 then extract(minute from enddate)
                 else 0
            end)
           ) as minutes
from table t join
     nums n
     where trunc(t.startdate + n * 1/24, 'hh') <= t.enddate;

Ini bekerja hingga 100 jam perbedaan tanggal. Anda dapat menyesuaikan 100 untuk kebutuhan Anda. Anda bahkan dapat menggunakan subquery untuk mendapatkan nilai maksimum yang tepat.

Ada beberapa trik yang bisa menyederhanakan logika. Saya pikir logika di atas paling jelas. Ini siklus melalui jam. Jika jam yang dibandingkan adalah jam pertama, gunakan 60 - menit. Jika terakhir, gunakan menit. Jika tidak, gunakan 60.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Deteksi kesalahan sqlplus dalam skrip batch dos?

  2. Kembalikan koleksi dari fungsi yang dikemas untuk digunakan di pilih

  3. Bagaimana cara menampilkan nilai default ketika tidak ada kecocokan yang ditemukan dalam kueri?

  4. Bagaimana saya bisa menguji nol dan bukan nol secara bersamaan di sql?

  5. Membuat indeks spasial di oracle