3

有人可以解释一下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

4

1 回答 1

3

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

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

手册指出:

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_ADD, DATE_SUB),因为它们旨在查看像上面这样的东西在应该返回130/170时如何返回90

于 2013-06-05T13:13:39.317 回答