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

问题描述 投票:0回答:3

我正在尝试创建一个查询,该查询始终将时间戳四舍五入到下一个完整的 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 datetime rounding
3个回答
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

演示在这里


0
投票

好问题! 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. 的表
  3. 字段
    timestamp_value
    存储时间戳。

测试一下这里


0
投票

Postgres 14 起,有

date_bin()
截断 到最近的时间间隔。 (类似于
date_trunc()
,只能截断为完整单位(1 分钟、1 小时等)。

date_bin('10 min', ts, '2000-1-1')

但是您想要天花板,而不是地板
对于精确匹配来说,仅添加 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

而且比手动计算快约 5 倍。
或者更短、更快一点,但是(如果不是那么清楚):

COALESCE(NULLIF(date_bin('10 min', ts, '2000-1-1'), ts) + interval '10 min', ts)

小提琴

参见:

© www.soinside.com 2019 - 2024. All rights reserved.