提问人:Adarsh 提问时间:8/18/2023 最后编辑:Erwin BrandstetterAdarsh 更新时间:8/19/2023 访问量:146
查询将时间戳四舍五入到最接近的 10 分钟
Query to round up timestamp to nearest 10 minutes
问:
我正在尝试将时间戳四舍五入到下一个完整的 10 分钟。
我尝试了以下解决方案,但无法获得预期的结果
我也试过了,但无法让它工作。date_trunc()
预期结果:
输入 | 预期输出 |
---|---|
2023-07-01 10:00:00 | 2023-07-01 10:10:00 |
2023-07-01 10:00:01 | 2023-07-01 10:10:00 |
2023-07-01 10:01:00 | 2023-07-01 10:10:00 |
2023-07-01 10:05:00 | 2023-07-01 10:10:00 |
2023-07-01 10:09:59 | 2023-07-01 10:10:00 |
答:
1赞
SelVazi
8/18/2023
#1
这是一种方法:
select dtime,
(date_trunc('hour', dtime) +
(cast(extract(minute from dtime) as int)/10 + 1) * 10 * interval '1 minute'
) as rounded_dtime
from mytable
评论
1赞
Adarsh
8/18/2023
谢谢。这个解决方案符合我的需求
0赞
Abstract_Monk
8/19/2023
#2
好问题!Postgres 没有提供内置函数来获取此确切行为。
但是,您可以使用日期操作函数来实现此目的。要执行此操作的查询是:
SELECT
timestamp_value,
(date_trunc('hour', timestamp_value) +
CEIL(EXTRACT(MINUTE FROM timestamp_value) / 10) * INTERVAL '10 minutes') AS rounded_timestamp_value
FROM timestamps_table;
当然,此查询会做出一些假设:
- 您有一个名为
timestamps_table
- 字段存储时间戳。
timestamp_value
在这里测试一下
评论
0赞
Adarsh
8/19/2023
这并没有给我预期的结果。例如,如果我输入为“2023-07-01 10:00:00”,则输出也相同。而我预计值为“2023-07-01 10:10:00”。SelVazi 上面提供的解决方案运行良好
2赞
Erwin Brandstetter
8/19/2023
#3
从 Postgres 14 开始,有 date_bin()
截断到最接近的时间间隔。(类似于 ,它只能截断为完整单位(1 分钟、1 小时等)。date_trunc()
date_bin('10 min', ts, '2000-1-1')
但你想要的是天花板,而不是地板。
预期输出表示您对增加 10 分钟感到满意:
date_bin('10 min', ts, '2000-1-1') + interval '10 min'
也比手动计算快 ~ 5 倍。
要真正四舍五入(保持完全匹配而不是递增 10 分钟):
CASE WHEN date_bin('10 min', ts, '2000-1-1') = ts
THEN ts
ELSE date_bin('10 min', ts, '2000-1-1') + interval '10 min' END
或者更短,更快一点,但(如果不是那么清楚):
COALESCE(NULLIF(date_bin('10 min', ts, '2000-1-1'), ts) + interval '10 min', ts)
看:
评论