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

MySQL中datetime类型与整数运算(NOW()-86400)的行为探究

错误语句的执行结果分析

当TheTimestamp为datetime类型时,执行SELECT * FROM MyTable WHERE TheTimestamp > (NOW()-86400);会得到完全不符合预期的结果,具体过程如下:

  1. 数值转换与减法运算
    MySQL中,NOW()返回的datetime值(例如2024-05-20 10:00:00)会被隐式转换为无分隔符的整数形式:20240520100000。随后执行纯整数减法:20240520100000 - 86400 = 20240519136000(以86400为一天秒数的输入为例)。

  2. 无效时间的自动修正
    上述减法得到的整数20240519136000会被再次隐式转换回datetime类型,但这个数值对应的时间是2024-05-19 13:60:00——这是一个无效时间(分钟数不能超过59)。MySQL会自动将其修正为合法时间,比如2024-05-19 14:00:00,但这个结果和“当前时间减一天”的预期(即2024-05-19 10:00:00)完全无关。

  3. 最终查询结果
    查询会返回所有TheTimestamp大于这个修正后错误时间的行,而非你预期的“当前时间前一天之后”的行。

正确写法对比

要实现“查询当前时间前一天之后的数据”,应该使用MySQL的时间间隔运算:

  • 方式1:使用INTERVAL关键字:
    SELECT * FROM MyTable WHERE TheTimestamp > NOW() - INTERVAL 1 DAY;
    
  • 方式2:使用ADDDATE函数:
    SELECT * FROM MyTable WHERE TheTimestamp > ADDDATE(NOW(), INTERVAL -1 DAY);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:05:21