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 を調整できます あなたのニーズのために。サブクエリを使用して、正しい最大値を取得することもできます。

    ロジックを単純化できるいくつかのトリックがあります。上記の論理が最も明確だと思います。それは時間を通して循環します。比較する時間が最初の 1 時間の場合は、60 - 分を使用します。最後の場合は、議事録を使用します。それ以外の場合は、60 を使用してください。



    1. MySQL:すべてのタイムゾーンのUTCオフセットとDSTを選択するにはどうすればよいですか?

    2. アノテーション付きのmysqlでmybatisを使用してインサートのIDを返す方法

    3. T-SQLで昨日の日付を取得する方法

    4. Android:電話から連絡先をインポートする方法は?