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

使用Unix时间戳调用DATEDIFF()返回NULL结果的排查咨询

问题根源

DATEDIFF() 函数要求两个参数必须是日期/日期时间类型,但你通过 FROM_UNIXTIME(..., '%m-%d-%Y') 生成的是字符串格式的日期,MySQL无法将这类字符串识别为可计算的日期值,因此返回NULL。

解决方法

方法1:直接基于时间戳计算(高效推荐)

不需要转换为日期字符串,直接用秒级时间戳差值除以一天的秒数(86400),再取整得到天数差:

SELECT 
  FROM_UNIXTIME(synced_on/1000,'%m-%d-%Y') AS synced_on_date,
  FROM_UNIXTIME(UNIX_TIMESTAMP(), '%m-%d-%Y') AS current_date,
  -- 当前时间 - 同步时间的天数差
  FLOOR((UNIX_TIMESTAMP() - synced_on/1000)/86400) AS datediff_two,
  -- 同步时间 - 当前时间的天数差
  FLOOR((synced_on/1000 - UNIX_TIMESTAMP())/86400) AS datediff
FROM db.tableA;

方法2:确保DATEDIFF接收日期类型参数

如果坚持使用DATEDIFF,可以不指定格式化字符串(默认返回datetime类型),或者显式转换为DATE类型:

SELECT 
  FROM_UNIXTIME(synced_on/1000,'%m-%d-%Y') AS synced_on_date,
  FROM_UNIXTIME(UNIX_TIMESTAMP(), '%m-%d-%Y') AS current_date,
  -- 不指定格式化字符串,直接传入datetime类型
  DATEDIFF(FROM_UNIXTIME(synced_on/1000), NOW()) AS datediff,
  DATEDIFF(NOW(), FROM_UNIXTIME(synced_on/1000)) AS datediff_two,
  -- 显式转换为DATE类型
  DATEDIFF(DATE(FROM_UNIXTIME(synced_on/1000)), DATE(NOW())) AS datediff_date,
  DATEDIFF(DATE(NOW()), DATE(FROM_UNIXTIME(synced_on/1000))) AS datediff_two_date
FROM db.tableA;
额外排查点
  • 检查synced_on字段是否存在NULL值:如果synced_on为NULL,synced_on/1000也会是NULL,导致后续计算返回NULL,可通过WHERE synced_on IS NOT NULL过滤无效数据。
  • 验证参数类型:执行SELECT typeof(FROM_UNIXTIME(synced_on/1000,'%m-%d-%Y'))会返回string,而typeof(FROM_UNIXTIME(synced_on/1000))返回datetime,这也能直观确认问题所在。

内容的提问来源于stack exchange,提问作者user2205916

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:24:56