2017-10-11 10 views
0

と重複する時間の量を計算することができ、私はAttemptsそれらを呼び出す:PSQL:日付範囲のテーブルでは、どのように私はこのように見える日付範囲のテーブルを持って、選択した日付範囲

id |   start   |   end 
-----+----------------------------+---------------------------- 
1 | 2017-09-09 01:09:00  | 2017-09-09 02:09:00 
58 | 2017-09-09 08:35:51.420588 | 2017-09-09 17:01:57.106442 
59 | 2017-09-09 17:12:13.644954 | 2017-09-09 17:17:42.186903 
60 | 2017-09-09 17:18:51.794184 | 2017-09-09 17:50:09.508929 
61 | 2017-09-09 17:19:31.205516 | 2017-09-09 17:20:11.924069 
62 | 2017-09-09 17:20:32.320789 | 2017-09-09 17:23:19.973078 
63 | 2017-09-09 17:23:53.849006 | 2017-09-09 17:24:23.574369 
64 | 2017-09-09 17:24:56.333346 | 2017-09-09 17:27:10.556657 
65 | 2017-09-09 17:27:12.605315 | 2017-09-09 17:27:14.680357 

私は、そのテーブルと指定された日付範囲の重複時間の合計量を返すクエリを作成したいと思います。たとえば、9月の月に試行時間の合計を取得したいとします。

+1

オーバーラップ間隔が9月に開始し、10月に終了する場合はどうなりますか? –

+0

その場合と逆(8月に始まり9月に終わる)は、私がSQLで扱う方法を知らないものです。 – refeniz

+0

このようなオーバーラッピング間隔全体を含めるべきかどうかを質問しています –

答えて

1

input_rangeにパラメータを入力します。

まず、あなたの範囲

WHERE "start" < range_end 
    AND "end" > range_start 

で行の重複かどうかを確認する必要があります。しかし、その行はその範囲を超えた場合は、代わりに

CASE WHEN "start" < range_start 
    THEN range_start 
    ELSE "start" 
END as new_start 

が続いてタイムスタンプbeteeen秒を合計範囲の境界線を再割り当て

SUM (EXTRACT(EPOCH FROM (new_end - new_start))) 

SQL DEMO

WITH input_range as (
    SELECT '2017-09-09 17:18'::timestamp as range_start, 
      '2017-09-09 17:22'::timestamp as range_end 
), fix_data as (
    SELECT A.*, CASE WHEN "start" < range_start 
        THEN range_start 
        ELSE "start" 
       END as new_start 
       , CASE WHEN "end" > range_end 
        THEN range_end 
        ELSE "end" 
       END as new_end  
    FROM Attempts A 
    CROSS JOIN input_range 
    WHERE "start" < range_end 
     AND "end" > range_start 
) 
SELECT SUM (EXTRACT(EPOCH FROM (new_end - new_start))) 
     -- * to see what are you SUM 
FROM fix_data; 
+0

私はいくつかの範囲でそれをテストし、それは素晴らしいです!ありがとう、トン。 – refeniz

+0

解決プロセスの一環として、 'input_range' cteを作成する' WHERE'に直接パラメータを置くことができます。 –