Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Benötigen Sie Oracle SQL, um den Datums-/Zeitbereich nach Tag aufzuteilen

Dies ist in SQL möglich. Es gibt zwei Tricks. Die erste besteht darin, eine Reihe von Zahlen zu generieren, was Sie mit einem CTE mit connect tun können .

Die zweite besteht darin, die richtige Logik zusammenzustellen, um die Daten zu erweitern, während die richtigen Zeiten für Anfang und Ende beibehalten werden.

Das Folgende ist ein Beispiel:

with n as (
      select level n
      from dual connect by level <= 20
     ),
     t as (
      select 1 as id, to_date('01/01/2000 4', 'mm/dd/yyyy hh') as StartDate, to_date('01/03/2000 6', 'mm/dd/yyyy hh') as EndDate from dual union all
      select 2 as id, to_date('01/04/2000 8', 'mm/dd/yyyy hh') as StartDate, to_date('01/04/2000 12', 'mm/dd/yyyy hh') as EndDate from dual union all
      select 3 as id, to_date('01/05/2000', 'mm/dd/yyyy') as StartDate, to_date('01/06/2000', 'mm/dd/yyyy') as EndDate from dual
     )
select t.id,
       (case when n = 1 then StartDate
             else trunc(StartDate + n - 1)
        end) as StartDate,
       (case when trunc(StartDate + n - 1) = trunc(enddate)
             then enddate
             else trunc(StartDate + n)
        end)
from t join
     n
     on StartDate + n - 1 <= EndDate
order by id, StartDate

Hier ist es auf SQLFiddle.