SQL查询实现:提取当前整点至当前时间的Unix时间戳记录
SQL实现方案:提取当前小时整点至查询执行时刻的条目
核心逻辑
该查询不需要手动传入时间参数,每次执行时自动计算时间边界:
- 左边界:查询执行时刻所属小时的整点0分0秒,转换为对应Unix时间戳
- 右边界:查询执行的精确时刻,转换为对应Unix时间戳
- 整点时间戳通用计算方法:将当前Unix时间戳除以3600(1小时对应的秒数)做整数截断,再乘以3600,即可抹除分钟、秒级的时间偏移,得到本小时整点的时间戳。
不同数据库的可直接复用代码
请替换代码中的你的表名为实际业务表名,created_at为实际存储Unix时间戳的创建时间字段名。
- MySQL / MariaDB(秒级时间戳)
SELECT * FROM 你的表名 WHERE created_at >= (UNIX_TIMESTAMP() DIV 3600) * 3600 AND created_at <= UNIX_TIMESTAMP();
- PostgreSQL(秒级时间戳)
SELECT * FROM 你的表名 WHERE created_at >= (EXTRACT(EPOCH FROM NOW())::INTEGER / 3600) * 3600 AND created_at <= EXTRACT(EPOCH FROM NOW())::INTEGER;
- ClickHouse(秒级时间戳)
SELECT * FROM 你的表名 WHERE created_at >= intDiv(toUnixTimestamp(now()), 3600) * 3600 AND created_at <= toUnixTimestamp(now());
- SQLite(秒级时间戳)
SELECT * FROM 你的表名 WHERE created_at >= (CAST(strftime('%s', 'now') AS INTEGER) / 3600) * 3600 AND created_at <= CAST(strftime('%s', 'now') AS INTEGER);
毫秒级Unix时间戳适配
如果created_at字段存储的是13位毫秒级Unix时间戳,只需要把边界计算结果统一乘1000即可,以MySQL为例:
SELECT * FROM 你的表名 WHERE created_at >= (UNIX_TIMESTAMP() DIV 3600) * 3600 * 1000 AND created_at <= UNIX_TIMESTAMP() * 1000;
效果验证
假设查询执行时间为13:37:20,对应秒级Unix时间戳为1718000240:
- 左边界计算:
(1718000240 DIV 3600) *3600 = 1717999200,对应时间恰好是当日13:00:00 - 右边界为1718000240,对应13:37:20
查询会返回该时间段内的所有条目;如果13:45再次执行同一SQL,右边界会自动更新为13:45对应的时间戳,左边界保持13:00的时间戳不变,完全匹配需求规则。
内容的提问来源于stack exchange,提问作者andreis25
相关产品推荐
相关产品推荐

