Mysql时间戳差异结果

时间:2014-10-27 14:14:49

标签: mysql date

我的表格中包含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计算的内容吗?这不是正确的数量级,我很难过。

4 个答案:

答案 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表示。