MySQL日期时间运算

4
有人能否解释一下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


我认为在MySQL中使用+-进行日期计算存在缺陷(如果不是完全失效的话)。将一个数字添加到日期会返回一个奇怪的数字而不是日期:http://www.sqlfiddle.com/#!2/d41d8/13888。只需坚持使用date_add()函数,你就不会出现这种情况了。 - user330315
将数字添加到日期会返回YYYYMMDD格式的日期,这是完全可以的,并且已经记录在案,据我所知。 - tencek
2
不,这不是一个“日期”,而是一个数字(完全不同的东西)。是的,它有文档记录,但这并不意味着它不奇怪。 - user330315
1个回答

4

起初,我认为失败的原因是因为当时间间隔在日期之前时无法进行减法运算。

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

然而,您应该使用日期函数(DATE_ADDDATE_SUB)来使用INTERVAL,因为像上面那样返回130/170时,它应该返回90

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接