无法在没有时区的时间戳字段上加入不带时区的generate_series时间戳

时间:2019-10-10 19:13:11

标签: postgresql

我正在尝试找到一种方法来报告一个地点同时有多少人,直到第二个。 我有一张桌子,上面有这个人的身份证,他们输入的日期,他们输入的时间,他们离开的日期和他们离开的时间。 例如:

select unique_id, start_date, start_time, end_date, end_time
from My_Table
where start_date between '09/01/2019' and '09/02/2019'
limit 3

"unique_id" "start_date"    "start_time"    "end_date"  "end_time"
989179  "2019-09-01"    "06:03:13"  "2019-09-01"    "06:03:55"
995203  "2019-09-01"    "11:29:27"  "2019-09-01"    "11:30:13"
917637  "2019-09-01"    "11:06:46"  "2019-09-01"    "11:06:59"

我已经将开始日期和开始时间以及结束日期和结束时间串联在一起,所以它们是2个字段

select unique_id, ((start_date + start_time)::timestamp without time zone) as start_date, 
((end_date + end_time)::timestamp without time zone) as end_date

结果示例:

"start_date"
"2019-09-01 09:28:54"

所以我要创建一个CTE,然后使用第二个CTE,该CTE在向下到第二个之间的日期之间使用generate_series。

目标是,generate系列将在两个日期之间每秒间隔一行。然后,当我加入数据集时,我可以计算my_table中存在多少记录,其中start_date(加上时间)等于或大于generate_series date_time字段,而end_date(加上时间)小于或等于generate_series date_time字段。

我觉得这很难解释。

从理论上讲,如果一个人从2019-09-01 00:01:01开始在房间里离开,并在2019-09-01 00:01:03离开,我会在2019-09的generate_series行中记录该记录-01 00:01:01、2019-09-01 00:01:02和2019-09-01 00:01:03。

当我查看数据时,可以看到我应该在特定的高峰时段将数百人送回房间。但查询返回全0。

这是否可能是我需要调整的字段格式问题?

以下是查询:

with CTE as (
select unique_id, ((start_date+start_time)::timestamp without time zone) as start_date, 
((end_date+end_time)::timestamp without time zone) as end_date
from My_table
where start_date between '09/01/2019' and '09/02/2019'
),
time_series as (
    select generate_series( (date '2019-09-01')::timestamp, (date '2019-09-02')::timestamp, interval '1 second') as date_time
)
/*FINAL SELECT*/
select date_time, count(B.unique_id) as NumPpl
FROM (
    select A.date_time
    FROM time_series a
)x
left join CTE b on b.start_date >= x.date_time AND b.end_date <= x.date_time
GROUP BY 1
ORDER BY 1

(partial) result screenshot

提前谢谢

我还应该添加我对该数据库具有只读访问权限,因此我无法创建函数。

1 个答案:

答案 0 :(得分:0)

简单版本:假设UPDATE_COMPLETE总是在b.start_date >= x.date_time AND b.end_date <= x.date_time之后,end_date就永远不会成立。

更长的版本:start_date也不需要CTE,也没有理由选择此CTE的所有列和所有行作为子查询。我还将删除原始数据的CTE,然后将其加入秒数(注意:这确实以某种方式更改了查询,因为您现在可能会将这些条目考虑在内,其中generate_series()早于start_date。如果您不希望这样做,则可以再次将条件添加到联接条件中(但是我想这是您真正想要的)。我还删除了一些不需要的演员表。试试这个:

2019-09-01