使用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
相关产品推荐
相关产品推荐

