MySQL统计未来1-7天日期记录SUM结果为0的问题排查
错误原因
你的SQL写法存在两处核心问题,导致统计结果始终为0:
- 类型不匹配:
mydate字段存储的是整数格式的Unix时间戳,但CURDATE() + INTERVAL N DAY返回的是YYYY-MM-DD格式的日期值,整数和日期类型直接做等值判断不可能命中有效记录。 - 匹配逻辑错误:即使将日期转换为时间戳,直接用等值匹配也只能命中对应日期0点0分0秒的时间戳,当天其他时分秒生成的记录全部会被漏掉。
修正写法
先确认mydate存储的是10位秒级时间戳还是13位毫秒级时间戳,通过类型对齐+范围匹配的方式统计即可,以下是一次性统计未来1~7天数据的SQL示例(默认适配秒级时间戳):
SELECT SUM(CASE WHEN mydate >= UNIX_TIMESTAMP(CURDATE() + INTERVAL 1 DAY) AND mydate < UNIX_TIMESTAMP(CURDATE() + INTERVAL 2 DAY) THEN 1 ELSE 0 END) AS p1, SUM(CASE WHEN mydate >= UNIX_TIMESTAMP(CURDATE() + INTERVAL 2 DAY) AND mydate < UNIX_TIMESTAMP(CURDATE() + INTERVAL 3 DAY) THEN 1 ELSE 0 END) AS p2, SUM(CASE WHEN mydate >= UNIX_TIMESTAMP(CURDATE() + INTERVAL 3 DAY) AND mydate < UNIX_TIMESTAMP(CURDATE() + INTERVAL 4 DAY) THEN 1 ELSE 0 END) AS p3, SUM(CASE WHEN mydate >= UNIX_TIMESTAMP(CURDATE() + INTERVAL 4 DAY) AND mydate < UNIX_TIMESTAMP(CURDATE() + INTERVAL 5 DAY) THEN 1 ELSE 0 END) AS p4, SUM(CASE WHEN mydate >= UNIX_TIMESTAMP(CURDATE() + INTERVAL 5 DAY) AND mydate < UNIX_TIMESTAMP(CURDATE() + INTERVAL 6 DAY) THEN 1 ELSE 0 END) AS p5, SUM(CASE WHEN mydate >= UNIX_TIMESTAMP(CURDATE() + INTERVAL 6 DAY) AND mydate < UNIX_TIMESTAMP(CURDATE() + INTERVAL 7 DAY) THEN 1 ELSE 0 END) AS p6, SUM(CASE WHEN mydate >= UNIX_TIMESTAMP(CURDATE() + INTERVAL 7 DAY) AND mydate < UNIX_TIMESTAMP(CURDATE() + INTERVAL 8 DAY) THEN 1 ELSE 0 END) AS p7 FROM mytable;
如果字段存储的是毫秒级时间戳,将所有
UNIX_TIMESTAMP()的计算结果乘1000即可,例如UNIX_TIMESTAMP(CURDATE() + INTERVAL 1 DAY) * 1000。
逻辑说明
- 用
UNIX_TIMESTAMP()函数将MySQL原生日期转换为对应0点的Unix时间戳,和字段存储类型保持一致,解决类型不匹配问题 - 采用左闭右开的时间范围判断代替等值判断,自动覆盖对应日期内所有时分秒的记录,不会漏数
- 直接对字段做范围判断可以命中
mydate字段的索引,查询效率远高于在字段上套用FROM_UNIXTIME()等转换函数的写法
内容的提问来源于stack exchange,提问作者Darksymphony
相关产品推荐
相关产品推荐

