SQL查询numeric类型timestamp列月度范围数据无结果如何解决
问题原因
sessions表的timestamp字段为int类型,存储的是秒级Unix时间戳,直接与字符串格式的日期时间比较会触发隐式类型转换,既无法命中timestamp索引,也会导致匹配逻辑异常。- 原查询的时间范围上限为
2021-10-31 00:00:00,会遗漏10月31日全天的所有记录。
正确写法
推荐使用UNIX_TIMESTAMP函数将日期转换为Unix时间戳后比较,类型匹配且可正常使用索引,查询效率更高:
SELECT uid FROM sessions WHERE `timestamp` >= UNIX_TIMESTAMP('2021-10-01 00:00:00') AND `timestamp` < UNIX_TIMESTAMP('2021-11-01 00:00:00');
注意事项
- 时间上限设置为次月1日0点,可自动覆盖当前月最后一天的全部时间,无需手动计算当月最后一天的23:59:59。
- 不推荐使用
FROM_UNIXTIME将timestamp字段转为日期后再比较,该写法会导致索引失效,数据量较大时查询性能极差。
内容的提问来源于stack exchange,提问作者asdasd
相关产品推荐
相关产品推荐

