MySQL中INT类型时间戳字段匹配CURDATE()查询无结果求助
解决MySQL INT类型时间戳查询今日数据的问题
嘿,我来帮你搞定这个问题!你的核心问题出在INT类型的秒级时间戳和MySQL日期函数的交互逻辑上,下面一步步拆解分析:
为什么之前的语句都失效了?
你的r_insert_time是存储秒级时间戳的INT字段(比如1547043955对应某个具体的年月日时分秒),但你用的DATE()函数不会自动把这个数字当成时间戳处理——MySQL会把这个INT值直接转成字符串,然后尝试解析成YYYYMMDD格式的日期,这显然和时间戳的含义完全不搭,最终得到的是无效日期(甚至是NULL),自然匹配不上CURDATE()。
比如你执行SELECT DATE(1547043955);,得到的结果会是NULL,因为MySQL没法把"1547043955"解析成合法日期,所以DATE(r_insert_time) = CURDATE()永远不成立,返回0条结果。
正确的查询方式
方式1:先转时间戳为日期时间,再提取日期(直观但性能稍差)
用FROM_UNIXTIME()函数把INT时间戳转换成MySQL能识别的日期时间格式,再用DATE()提取日期部分:
SELECT COUNT(*) FROM rdv WHERE u_id = ? AND DATE(FROM_UNIXTIME(r_insert_time)) = CURDATE();
方式2:用时间戳范围查询(推荐,可利用索引)
如果你的r_insert_time字段有索引,这种方式性能更好,因为避免了对每一行数据做函数转换:
SELECT COUNT(*) FROM rdv WHERE u_id = ? AND r_insert_time >= UNIX_TIMESTAMP(CURDATE()) AND r_insert_time < UNIX_TIMESTAMP(CURDATE() + INTERVAL 1 DAY);
解释一下:
UNIX_TIMESTAMP(CURDATE())返回今天00:00:00对应的秒级时间戳CURDATE() + INTERVAL 1 DAY是明天的日期,转成时间戳就是明天00:00:00的时间戳- 用
>=和<就能精准匹配今天一整天的所有时间戳
验证方法
你可以先执行这条语句,确认时间戳转换后的日期是否正确:
SELECT r_insert_time, FROM_UNIXTIME(r_insert_time) AS datetime, DATE(FROM_UNIXTIME(r_insert_time)) AS date, CURDATE() AS today FROM rdv WHERE u_id = ? LIMIT 10;
这样就能直观看到你的时间戳对应的日期是不是今天,排查是否有其他问题(比如u_id不匹配、时间戳时区问题等)。
内容的提问来源于stack exchange,提问作者medk
相关产品推荐
相关产品推荐

