将时间戳截断到特定边界是数据库处理中的常见操作。对于 Postgres,date_trunc 函数提供了一种将时间戳四舍五入到小时或分钟的简单方法。然而,截断到最接近的 5 分钟间隔需要更定制的方法。
直接方法
5 分钟截断的典型解决方案是将 date_trunc 与整数除法和乘法运算:
date_trunc('hour', val) + date_part('minute', val)::int / 5 * interval '5 min'
替代方法
有两种将时间戳截断为 5 分钟间隔的替代方法:
方法 1:历元算术
此方法计算时间戳,方法是将其转换为纪元/unix 时间,将其向下舍入到最近的 5 分钟间隔,然后转换它返回到时间戳。以下查询演示了这种方法:
SELECT to_timestamp( floor(EXTRACT(epoch FROM ht.time) / EXTRACT(epoch FROM interval '5 min')) * EXTRACT(epoch FROM interval '5 min') ) FROM huge_table AS ht
方法 2:date_trunc 和 date_part
此方法与直接方法类似,但它分别使用 date_trunc 和 date_part来实现四舍五入。以下查询说明了此方法:
SELECT date_trunc('hour', ht.time) + date_part('minute', ht.time)::int / 5 * interval '5 min' FROM huge_table AS ht
性能比较
大型表上的性能测试表明,简单的方法优于两种替代方法。结果显示:
Method | Run 1 (seconds) | Run 2 (seconds) | Run 3 (seconds) |
---|---|---|---|
Epoch Arithmetic | 39.368 | - | 39.526 |
date_trunc and date_part | 34.189 | - | 37.028 |
结论
虽然替代方法提供了一些多功能性和简单性,但使用 date_trunc 和 date_part 的直接方法提供了截断时间戳的最快解决方案在 Postgres 中为 5 分钟间隔。
以上是如何在 PostgreSQL 中有效地将时间戳截断为 5 分钟间隔?的详细内容。更多信息请关注PHP中文网其他相关文章!