我有一个带有TIMESTAMP字段(lastHonored)的表。
我运行了以下查询:
SELECT NOW(), lastHonored,
TIMESTAMPDIFF(SECOND, lastHonored, NOW()), NOW()-lastHonored
FROM db.table我得到了结果:
NOW() | lastHonored | DIFF | SUBTRACT
2014-10-27 14:07:22 | 2014-10-26 19:49:51 | 65851 | 945771
其中DIFF是TIMESTAMPDIFF函数的结果,减法是NOW()-lastHonored表达式的结果。
DIFF看起来是对的,但是谁能告诉我NOW()-lastHonored的计算结果呢?它不是正确的数量级,我很困惑。
发布于 2014-10-27 14:19:30
人们可能会认为NOW()返回一个datetime或类似类型。但不是。由于某些历史原因,NOW()返回一个数字或一个字符串。引用文档
将当前日期和时间作为‘YYYY DD HH:MM:SS’或YYYYMMDDHHMMSS格式的值返回,具体取决于函数是在字符串上下文中使用还是在数字上下文中使用。该值在当前时区中表示。
这意味着NOW()将根据其上下文转换为一个值。-表示一个数字上下文,因此NOW()是一个数字为YYYYMMDDHHMMSS的数字。我的猜测是,lastHonored得到了类似的转换,因此结果是两个数字之间的区别。
发布于 2014-10-27 14:20:24
您可以通过运行:
SELECT CAST(NOW() AS UNSIGNED), CAST('2014-10-26 19:49:51' AS UNSIGNED);通过简单的减法,MySQL将两个值转换为数字。NOW()日期时间变成20141027141923,但是2014-10-26 19:49:51字符串变成2014。
如果您第一次将日期转换为DATETIME,它会给出更符合您预期的结果:
SELECT CAST(NOW() AS UNSIGNED), CAST(CAST('2014-10-26 19:49:51' AS DATETIME) AS UNSIGNED);发布于 2014-10-27 14:21:00
您不能像使用NOW()-lastHonored那样减去日期。日期/日期时间不能直接“减除”:
MariaDB [test]> select '2014-10-27 08:18:00' - '2014-10-27 08:17:00';
+-----------------------------------------------+
| '2014-10-27 08:18:00' - '2014-10-27 08:17:00' |
+-----------------------------------------------+
| 0 |
+-----------------------------------------------+
1 row in set, 2 warnings (0.00 sec)
MariaDB [test]> show warnings;
+---------+------+---------------------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '2014-10-27 08:18:00' |
| Warning | 1292 | Truncated incorrect DOUBLE value: '2014-10-27 08:17:00' |
+---------+------+---------------------------------------------------------+
2 rows in set (0.00 sec)注意警告。您将得到结果,但它们几乎总是完全无用/不正确的结果,因为MySQL将日期值转换为双值。
https://stackoverflow.com/questions/26589510
复制相似问题