查询将时间戳四舍五入到最接近的 10 分钟

Query to round up timestamp to nearest 10 minutes

提问人:Adarsh 提问时间:8/18/2023 最后编辑:Erwin BrandstetterAdarsh 更新时间:8/19/2023 访问量:146

问:

我正在尝试将时间戳四舍五入到下一个完整的 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
SQL PostgreSQL 日期时间 舍入

评论


答:

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;

当然,此查询会做出一些假设:

  1. 您有一个名为timestamps_table
  2. 字段存储时间戳。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)

小提琴

看: