我的表格中包含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函数的结果,而SUBTRACT是NOW()-lastHonored
表达的结果。
DIFF看起来不错,但有人能告诉我NOW()-lastHonored
计算的内容吗?这不是正确的数量级,我很难过。
答案 0 :(得分:3)
认为 NOW()
会返回datetime
或类似的类型。但不是。出于某些历史原因,NOW()
返回数字或字符串。引用documentation:
以' YYYY-MM-DD HH:MM:SS'中的值返回当前日期和时间。 或YYYYMMDDHHMMSS格式,具体取决于是否使用该功能 字符串或数字上下文。该值以当前值表示 时区。
这意味着NOW()
会根据其上下文转换为值。 -
建议使用数字上下文,因此NOW()
是一个数字为YYYYMMDDHHMMSS的数字。我的猜测是lastHonored
被类似地转换,结果是两个数字之间的差异。
答案 1 :(得分:2)
您可以通过运行来了解原因:
SELECT CAST(NOW() AS UNSIGNED), CAST('2014-10-26 19:49:51' AS UNSIGNED);
通过简单的减法,MySQL将两个值都转换为数字。 NOW()
DATETIME 变为20141027141923
,但{{1>} STRING 变为2014-10-26 19:49:51
。
如果您首次将日期投放到2014
,它会为您提供更符合您期望的结果:
DATETIME
答案 2 :(得分:0)
您无法像使用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将日期值转换为双倍。
答案 3 :(得分:0)
他们做不同的事情,减法并没有考虑到你正在处理时间。
如果你这样做:
SELECT NOW(), lastHonored,
TIMESTAMPDIFF(SECOND, lastHonored, NOW()) THE_DIFF, NOW()-lastHonored THE_SUBSTRACTION,
NOW()+0 NOW_NUMBER_REPRESNTATION,
lastHonored+0 lastHonored_NUMBER_REPRESENTATION
FROM db.table
您将看到数字差异用减法表示,时间差异用TIMESTAMPDIFF表示。