sql >> データベース >  >> RDS >> Oracle

日付/時刻範囲を日ごとに分割するには、OracleSQLが必要です

    これはSQLで行うことができます。 2つのトリックがあります。 1つ目は、一連の数値を生成することです。これは、connectを使用してCTEで実行できます。 。

    2つ目は、開始と終了の適切な時刻を維持しながら、日付を拡張するための適切なロジックをまとめることです。

    次に例を示します。

    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
    

    これはSQLFiddleにあります。



    1. SQL Server:初心者向けの便利なヒント

    2. STRING_AGGでDISTINCT値を生成します

    3. MySQLを使用するようにDjangoを設定する

    4. Entity FrameworkCode-FirstInitializerでデータベース照合を設定します