Mysql时间戳差异结果
我有一个带有Mysql时间戳差异结果,mysql,date,Mysql,Date,我有一个带有时间戳字段(lastName)的表 我运行了以下查询: SELECT NOW(), lastHonored, TIMESTAMPDIFF(SECOND, lastHonored, NOW()), NOW()-lastHonored FROM db.table 我得到的结果是: NOW()| lastlowned | DIFF | SUBTRACT 2014-10-27 14:07:22 | 2014-10-26 19:49:51 | 65851 | 945771 其中D
时间戳
字段(lastName
)的表
我运行了以下查询:
SELECT NOW(), lastHonored,
TIMESTAMPDIFF(SECOND, lastHonored, NOW()), NOW()-lastHonored
FROM db.table
我得到的结果是:
NOW()| lastlowned | DIFF | SUBTRACT
2014-10-27 14:07:22 | 2014-10-26 19:49:51 | 65851 | 945771
其中DIFF是TIMESTAMPDIFF函数的结果,而SUBTRACT是NOW()-lastmolder
expression的结果
DIFF看起来不错,但是有人能告诉我NOW()-lastmolder
计算什么吗?这不是正确的数量级,我被难住了。有人会认为NOW()
返回datetime
或类似类型。但不是。出于某些历史原因,NOW()
返回数字或字符串。引述:
以“YYYY-MM-DD HH:MM:SS”中的值返回当前日期和时间
或YYYYMMDDHMMSS格式,具体取决于函数是否在中使用
字符串或数字上下文。该值以当前值表示
时区
这意味着
NOW()
将根据上下文转换为值。-
表示数字上下文,因此NOW()
是一个数字,其数字为YYYYMMDDHHMMSS。我的猜测是,lastmolder
得到了类似的转换,因此结果是两个数字之间的差异。您可以通过运行以下命令来了解原因:
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);
您不能像使用
NOW()-lastName
那样减去日期。日期/日期时间不能直接“减去”:
注意警告。您将得到结果,但它们几乎总是完全无用/不正确的结果,因为MySQL将日期值转换为双倍值。它们做不同的事情,减法不考虑您处理的是时间 如果您这样做:
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表示
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