首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql时间戳差结果

问Mysql时间戳差结果
EN

Stack Overflow用户
提问于 2014-10-27 14:14:48
回答 4查看 61关注 0票数 2

我有一个带有TIMESTAMP字段(lastHonored)的表。

我运行了以下查询:

代码语言:javascript
复制
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的计算结果呢?它不是正确的数量级,我很困惑。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-10-27 14:19:30

人们可能会认为NOW()返回一个datetime或类似类型。但不是。由于某些历史原因,NOW()返回一个数字或一个字符串。引用文档

将当前日期和时间作为‘YYYY DD HH:MM:SS’或YYYYMMDDHHMMSS格式的值返回,具体取决于函数是在字符串上下文中使用还是在数字上下文中使用。该值在当前时区中表示。

这意味着NOW()将根据其上下文转换为一个值。-表示一个数字上下文,因此NOW()是一个数字为YYYYMMDDHHMMSS的数字。我的猜测是,lastHonored得到了类似的转换,因此结果是两个数字之间的区别。

票数 3
EN

Stack Overflow用户

发布于 2014-10-27 14:20:24

您可以通过运行:

代码语言:javascript
复制
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,它会给出更符合您预期的结果:

代码语言:javascript
复制
SELECT CAST(NOW() AS UNSIGNED), CAST(CAST('2014-10-26 19:49:51' AS DATETIME) AS UNSIGNED);
票数 2
EN

Stack Overflow用户

发布于 2014-10-27 14:21:00

您不能像使用NOW()-lastHonored那样减去日期。日期/日期时间不能直接“减除”:

代码语言:javascript
复制
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将日期值转换为双值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26589510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档