Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PSQL:使用日期范围表,如何计算与选定日期范围重叠的时间量_Sql_Postgresql - Fatal编程技术网

PSQL:使用日期范围表,如何计算与选定日期范围重叠的时间量

PSQL:使用日期范围表,如何计算与选定日期范围重叠的时间量,sql,postgresql,Sql,Postgresql,我有一个类似这样的日期范围表,我称之为尝试: 我想做一个查询,返回该表中的重叠时间总量和提供的日期范围。例如,我想获得9月份的总尝试时间。在输入范围中输入参数 首先,您需要检查一行是否与您的范围重叠 WHERE "start" < range_end AND "end" > range_start 如果重叠间隔从9月开始到10月结束会怎样?这种情况以及从8月开始到9月结束的相反情况是我不知道如何在sql中处理的。我想问的是,整个重叠间隔是否应该只包括重叠间隔。您对该样本数据

我有一个类似这样的日期范围表,我称之为尝试:

我想做一个查询,返回该表中的重叠时间总量和提供的日期范围。例如,我想获得9月份的总尝试时间。

在输入范围中输入参数

首先,您需要检查一行是否与您的范围重叠

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

如果重叠间隔从9月开始到10月结束会怎样?这种情况以及从8月开始到9月结束的相反情况是我不知道如何在sql中处理的。我想问的是,整个重叠间隔是否应该只包括重叠间隔。您对该样本数据的预期结果是什么?我已经测试过了有几个范围,看起来很棒!非常感谢。您可以将参数直接放在我创建输入范围cte的位置,作为我求解过程的一部分。
WHERE "start" < range_end
  AND "end"   > range_start
CASE WHEN "start" < range_start 
     THEN range_start
     ELSE "start"
END as new_start
SUM (EXTRACT(EPOCH FROM (new_end - new_start)))
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;