我正在尝试创建一个查询,该查询始终将时间戳四舍五入到下一个完整的 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 |
这里有一个方法:
select dtime,
(date_trunc('hour', dtime) +
(cast(extract(minute from dtime) as int)/10 + 1) * 10 * interval '1 minute'
) as rounded_dtime
from mytable
好问题! 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
存储时间戳。测试一下这里
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)
参见: