date_bin 或 date_bucket postgre SQL

date_bin or date_bucket postgre SQL

提问人:Pheluciam 提问时间:10/9/2023 最后编辑:ZegarekPheluciam 更新时间:10/9/2023 访问量:102

问:

我希望从 postgres SQL 中的时间戳字段创建 30 分钟的 bin。

举个例子,我有一个公共汽车旅行,它在现场的时间开始,一天有 1,000 次旅行,都在不同的时间(作为一个例子)。2023-01-01 11.13 UTCtrip_time

我想把上面的例子放在一个从 11.00 开始的垃圾箱时间中,任何在 11.30 或之后开始的巴士行程都会进入下一个垃圾箱 30 分钟的垃圾桶,以此类推。所以上面的字段示例将显示,任何行程都将在垃圾箱等中。date_bin()2023-01-01 11.002023-01-01 11.432023-01-01 11.30

我还想将结果转换为不同的时区,因为我的系统以 UTC 存储时间,但行程是澳大利亚/达尔文时间。

文档和函数看起来我必须输入实际的键入日期,而不是使用我的表字段作为源或源字段。date_bin()date_bucket

我提出的建议可能吗......?

我尝试了以下几种不同的变体:-

SELECT date_bucket('minute'
                   ,30
                   ,trip_time AT TIME ZONE 'UTC' AT TIME ZONE 'Australia/Darwin')
FROM table;
SELECT date_bin('30 minute'
                ,trip_time AT TIME ZONE 'UTC' AT TIME ZONE 'Australia/Darwin'
                ,TIMEZONE '1970-01-01' )

FROM table;

我不断收到“没有函数匹配....”错误。

SQL PostgreSQL 日期时间 bins

评论

0赞 kiner_shah 10/9/2023
我不认为有一个名为 .此外,在您的函数中,您提到了“30 分钟”而不是“30 分钟”,不确定这是否有区别,但请尝试一下。date_bucketdate_bin
0赞 Zegarek 10/9/2023
date_bucketPostgreSQL中不存在,这是Microsoft SQL Server方言。您的第二次调用接近正确:签名是 date_bin ( interval, timestamp, timestamp ) → timestamp。你已经给了它一个间隔和一个时间戳,所以第三个参数应该是一个时间戳,而“1970-01-01”是一个很好的起源:demo
0赞 SQLpro 10/9/2023
@Zegared不是 SQL Server 方言,而是 ISO SQL 标准功能。实际上没有在PostGreSQL中实现
0赞 Pheluciam 10/11/2023
衷心感谢 kiner_shah、Zegarek 和 SQLpro。从这些评论中可以看出,我正在我的新工作地点使用版本 13.10,因此date_bin功能不起作用。我对 SQL 也比较陌生,所以我仍在寻找自己的立足点。不确定如何在您的个人资料上给予“喜欢”或“谢谢”,但非常感谢大家的帮助。

答:

0赞 Stefanov.sm 10/9/2023 #1

文档所示,函数需要一个间隔、一个时间戳或时间戳以及另一个时间戳或时间戳,但不是您在第三个参数中所说的“时区”。您可以简单地用于 1970-01-01T00:00 UTC。 被放在函数之后,以影响函数结果。这是固定的。date_binepochAT TIME ZONE 'Australia/Darwin'

SELECT date_bin('30 minute', trip_time, 'epoch') AT TIME ZONE 'Australia/Darwin'
from the_table;

请注意,在 PG14 之前不存在。下面是早期版本的 Postgres 的实现。date_bin

评论

0赞 Pheluciam 10/11/2023
衷心感谢并道歉斯特凡诺夫。从上面的评论来看,我正在我的新工作地点使用 13.10 版,因此date_bin功能不起作用。我对 SQL 也比较陌生,所以我仍在寻找自己的立足点。不确定如何在您的个人资料上给予“喜欢”或“谢谢”,但非常感谢您的帮助。
0赞 Stefanov.sm 10/11/2023
我很感激。你可以接受答案。