MySQL存储为毫秒时间戳的bigint字段如何按日期条件正确查询
问题原因
CURDATE()返回的是YYYY-MM-DD格式的日期值,和premium_end_date存储的数值型时间戳类型不匹配,直接比较会触发隐式类型转换,导致条件永远不成立。
解决方案
不需要修改字段类型,按照你实际存储的时间戳精度选择对应写法即可:
- 参考你提供的样例数据,
premium_end_date是10位数值,实际为秒级Unix时间戳,优先使用如下写法:
WHERE premium_end_date >= UNIX_TIMESTAMP(CURDATE())
该写法将当前日期0点的时间转为对应秒级时间戳数值,和字段类型完全匹配,且可以命中premium_end_date字段上的索引,查询性能最优。
- 如果你确认字段实际存储的是13位毫秒级时间戳,只需将转换后的值乘以1000即可:
WHERE premium_end_date >= UNIX_TIMESTAMP(CURDATE()) * 1000
注意事项
不要使用FROM_UNIXTIME(premium_end_date) >= CURDATE()这类写法,对字段做函数运算会导致索引失效,数据量大时查询性能会大幅下降。
内容的提问来源于stack exchange,提问作者newCoder
相关产品推荐
相关产品推荐

