我知道代码不正确,应该使用ADDDATE函数,但我正在努力找出特定行为是否是由这个错误引起的。
那么,有人知道如果我有声明会发生什么吗
SELECT * FROM MyTable WHERE TheTimestamp > (NOW()-86400);
时间戳何时为日期时间数据类型?
这不是一个bug。你只是期望一个日期时间转换为一个数字,但事实并非如此。
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-literals.html说:
MySQL可以识别以下格式的DATETIME和TIMESTAMP值:
- 作为YYYYMMDdhmmss或YYYYMMDhhmmss格式的数字,前提是该数字作为日期有意义。例如,19830905132800和830905132800被解释为"1983-09-05 13:28:00">
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-types.html说:
- MySQL会自动将日期或时间值转换为数字(如果该值用于数字上下文(,反之亦然
因此在算术表达式中使用NOW()
将其转换为数字:
mysql> SELECT now(), now() + 0;
+---------------------+----------------+
| now() | now() + 0 |
+---------------------+----------------+
| 2022-10-19 14:13:14 | 20221019141314 |
+---------------------+----------------+
您可以看到,只需删除标点符号和空白,就可以将"2022-10-19 14:13:14"(我测试此查询的日期和时间(转换为整数。这不是一个可以加减的数字,因为60-99的值不用于秒或分钟,同样,24-99的值用于小时,32-99用于天,13-99用于月,等等。
您显示的表达式没有生成有效的时间戳数字:
mysql> SELECT now(), now() - 86400;
+---------------------+----------------+
| now() | now() - 86400 |
+---------------------+----------------+
| 2022-10-19 14:20:09 | 20221019055609 |
+---------------------+----------------+
^^ there is no time with 56 minutes
^^^^ yesterday's date should be 10/18
要对日期时间进行算术运算,您应该转换为秒的整数度量,然后在整数表达式中使用该值:
mysql> SELECT now(), unix_timestamp(now());
+---------------------+-----------------------+
| now() | unix_timestamp(now()) |
+---------------------+-----------------------+
| 2022-10-19 14:16:57 | 1666214217 |
+---------------------+-----------------------+
或者使用MySQL对时态INTERVAL
表达式的支持。看见https://dev.mysql.com/doc/refman/8.0/en/expressions.html#temporal-间隔
mysql> select now(), now() - interval 86400 second;
+---------------------+-------------------------------+
| now() | now() - interval 86400 second |
+---------------------+-------------------------------+
| 2022-10-19 14:24:01 | 2022-10-18 14:24:01 |
+---------------------+-------------------------------+
DATETIME和TIMESTAMP值是长度分别为5和4字节的隐式整数值(对于小数秒精度,可选择额外的字节(。数学运算符和条件运算符都将相应地工作。但是,这并不能像使用ADDTIME()
那样解释所有的隐式转换。
此操作专门查找晚于1天前创建的任何记录,因为DATETIME值必须大于(稍后(当前时间86400秒(1天/24小时(之前。