Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle заявка за групиране на разликата в датата по час

По принцип, за да решите това, ви трябва просто списък с числа.

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;

Това работи за до 100 часа разлика в датите. Можете да коригирате 100 за вашите нужди. Можете дори да използвате подзаявка, за да получите точната максимална стойност.

Има някои трикове, които могат да опростят логиката. Мисля, че горната логика е най-ясна. Цикълира през часовете. Ако сравненият час е първият час, използвайте 60 минути. Ако е последното, използвайте минутите. В противен случай използвайте 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. oracle.jdbc.driver.OracleDriver изключение за начинаещи Java

  2. Използването на DBMS_LOB.SUBSTR на BLOB води до ORA-06502

  3. Java Date.toString в TO_DATE на Oracle

  4. ORA-00942:Може ли да избира от schema.table, но не и таблица?

  5. как да промените състоянието на блока, за да вмъкнете в 10g с помощта на бутон за задействане