2017-02-02 26 views
0

「2017-02-02 11:00:00」と「2017-02-13 15:00:00」2日間のSQL差分(1日あたりの時間数)

これらの日の時間の違いですが、ひねりがあります:毎日の時間を知る必要があります。私はDATEDIFFを使用する唯一の時間だったが、私はどのように開始するには考えているねじれを想定した場合

結果は


'2017-02-02', '13' 
'2017-02-03', '24' 
... 
'2017-02-13', '15' 

ようになります。私はどんな考えにも感謝します。

PS:例えば異なる入力が存在し得る「2017年2月2日午前11時00分00秒」と「2017年2月2日午前15時00分00秒」

+0

は、2017年2月13日の結果が15でなければなりませんか? –

+0

generate_series(?.. –

+0

、15に固定していただきありがとうございました、脳がstackoverflow%を持っていました) – Sarief

答えて

1

あなたは、すべての生成にgenerate_seriesを使用することができます開始日と終了日の間隔を1時間としたdatetimes。次に、日付部分をグループ化して、毎日働く時間数を取得することができます。

select dt_time::date,count(*) as hours_by_day 
from (select generate_series('2017-02-02 11:00:00','2017-02-13 15:00:00',interval '1 hour') as dt_time 
    ) x 
group by dt_time::date 
order by 1 
+0

これは私が必要とするように見えます!最終日に16を返す理由は奇妙ですが、私は明確な頭でそれを理解することができます – Sarief

+0

'generate_series()'に両端が含まれているため、 '2017-02-13'の行を持つため、@Sariefは16を返します。 「00:00:00」から「15:00:00」(これは16行としてカウントされる)を含む。実際には、 'generate_series(:start、:end-interval '1 hour'、interval '1 hour')' – pozs

+0

@pozsまたは '2017-02-13 14:59:00'と呼ぶ必要があります。 – Sarief

1

一つの方法は、generate_series()を使用し、いくつかの算術:

with dates as (
     select gs.dte, $date1 as dte1, $date2 as dte2 
     from generate_series(date_trunc('day', $date1), date_trunc('day', $date2), interval '1 day') gs(dte) 
    ) 
select gs.dte, 
     (case when dte1 > gs.dte and dte2 < gs.dte then 24 
      when date_trunc('day', dte2) = gs.dte then 24 - extract(hour from dte1) 
      else extract(hour from dte2) 
     end) as hours 
from dates; 
関連する問題