如果在mysql中向日期时间添加一个整数,会发生什么



我知道代码不正确,应该使用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小时(之前。

最新更新