MySQL datetime算术

时间:2013-06-05 13:01:54

标签: mysql datetime

有人可以解释一下MySQL的这种行为吗?

查询:

SELECT NOW() + INTERVAL 90 SECOND - NOW() AS test;

结果:

  • 130 - 在now()处于(00:00 - 00:29)间隔的情况下

  • 170 - 在now()处于(00:30 - 00:59)间隔的情况下

我将130结果解释为“1分30秒”。 170结果很奇怪,我怀疑它与微小的溢出有关,但我无法解释它。

以下查询工作正常(我的意思是 - 正如我所料):

select TIMEDIFF( DATE_ADD( now(), INTERVAL 90 SECOND), now()) AS test;

结果:00:01:30

1 个答案:

答案 0 :(得分:2)

最初,在我看来这是失败的原因是因为你不能在日期之前的时间间隔减去。

SELECT INTERVAL 90 SECOND - NOW(); //..right syntax to use near '- NOW()'

manual州:

  如果另一侧的表达式是日期或日期时间值,则+运算符的任何一侧都允许

INTERVAL expr unit。对于 - 运算符,INTERVAL expr unit仅允许在右侧,因为从一个区间中减去日期或日期时间值是没有意义的。

SELECT CAST(NOW() + INTERVAL 90 SECOND AS DATETIME) - CAST(NOW() AS DATETIME)

我也很可能将130解释为1分30秒,但似乎正在发生的是通过减去时间部分(作为整数,而不是时间)来执行直接算术。

对于130:

SELECT CAST(NOW() + INTERVAL 90 SECOND AS DATETIME)
//June, 05 2013 13:10:50+0000

SELECT CAST(NOW() AS DATETIME)
//June, 05 2013 13:09:20+0000

SELECT CAST(NOW() + INTERVAL 90 SECOND AS DATETIME) - CAST(NOW() AS DATETIME)
//130

  1050
-  920
------
   130

170:

SELECT CAST(NOW() + INTERVAL 90 SECOND AS DATETIME)
//June, 05 2013 13:12:11+0000

SELECT CAST(NOW() AS DATETIME)
//June, 05 2013 13:10:41+0000

SELECT CAST(NOW() + INTERVAL 90 SECOND AS DATETIME) - CAST(NOW() AS DATETIME)
//170

   1211
-  1041
-------
    170

但是,您应该使用INTERVAL使用日期函数(DATE_ADDDATE_SUB),因为他们打算看到上面的内容返回130/170时应返回90