Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql时间戳差异结果_Mysql_Date - Fatal编程技术网

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