MySQL不同格式到期时间查询适配及cron去重查询问题
问题解答
你提供的SQL语句不能直接适配unix epoch int类型的expiry_date字段,也不需要提前在PHP中将时间戳转换为datetime格式,直接在SQL层做类型适配即可。
原SQL不兼容unix epoch字段的原因
原SQL中DATE_ADD(CURDATE(), INTERVAL N DAY)返回的是日期/datetime类型的值,和存储为int类型的unix时间戳格式不匹配,直接执行会出现类型比对错误,无法查询到正确结果。
两种字段格式的正确查询写法
1. 适配datetime类型expiry_date的表
保留原有逻辑,调整边界符号为左闭右开,刚好覆盖[1天,2天)的到期区间,也能避免cron每日运行时重复命中同一条记录:
SELECT * FROM 表名 WHERE expiry_date >= DATE_ADD(CURDATE(), INTERVAL 1 DAY) AND expiry_date < DATE_ADD(CURDATE(), INTERVAL 2 DAY)
2. 适配unix epoch int类型expiry_date的表
直接用SQL原生UNIX_TIMESTAMP()函数把时间边界转换为unix时间戳即可,无需在PHP层做转换:
SELECT * FROM 表名 WHERE expiry_date >= UNIX_TIMESTAMP(DATE_ADD(CURDATE(), INTERVAL 1 DAY)) AND expiry_date < UNIX_TIMESTAMP(DATE_ADD(CURDATE(), INTERVAL 2 DAY))
不推荐在PHP层转换的原因
- SQL原生时间转换函数执行效率更高,不会额外增加业务代码复杂度
- 避免PHP时区和数据库时区不一致导致的时间计算偏差,结果更准确
内容的提问来源于stack exchange,提问作者dds sddssd
相关产品推荐
相关产品推荐

