You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 15:48:16