MySQL中datetime类型与整数运算(NOW()-86400)的行为探究
错误语句的执行结果分析
当TheTimestamp为datetime类型时,执行SELECT * FROM MyTable WHERE TheTimestamp > (NOW()-86400);会得到完全不符合预期的结果,具体过程如下:
数值转换与减法运算
MySQL中,NOW()返回的datetime值(例如2024-05-20 10:00:00)会被隐式转换为无分隔符的整数形式:20240520100000。随后执行纯整数减法:20240520100000 - 86400 = 20240519136000(以86400为一天秒数的输入为例)。无效时间的自动修正
上述减法得到的整数20240519136000会被再次隐式转换回datetime类型,但这个数值对应的时间是2024-05-19 13:60:00——这是一个无效时间(分钟数不能超过59)。MySQL会自动将其修正为合法时间,比如2024-05-19 14:00:00,但这个结果和“当前时间减一天”的预期(即2024-05-19 10:00:00)完全无关。最终查询结果
查询会返回所有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
相关产品推荐
相关产品推荐

