MySQL中两个日期时间之间减运算符的行为是什么?

时间:2011-06-06 16:55:36

标签: mysql datetime

日期时间之间的差异是它们之间的秒数。这似乎仅在日期时间在同一小时内发生时才有效。

这是为什么?

mysql> update events set created_at = "2011-04-13 15:59:59", fulfilled_at ="2011-04-13 16:00:00" where id = 1;
mysql> select fulfilled_at - created_at, timediff(fulfilled_at, created_at) from events where id = 1;
+---------------------------+------------------------------------+
| fulfilled_at - created_at | timediff(fulfilled_at, created_at) |
+---------------------------+------------------------------------+
|               4041.000000 | 00:00:01                           |
+---------------------------+------------------------------------+

我知道我应该使用timediff,但我只是好奇为什么我会看到这个或者是否在某处记录过。

2 个答案:

答案 0 :(得分:7)

MySQL只是尽可能地将字符串转换为数字,以便它可以对它们进行数学运算。在这种情况下,它只是剥离所有非数字冒号,破折号和空格。

试试这个:

SELECT (20110413155959 - 20110413160000) AS dates;

您的日期,没有阻止他们成为数字的所有内容 - 结果是 -4041

答案 1 :(得分:6)

回想一下,mysql有两种不同类型的与日期时间相关的子类: _SUB 后缀用于减去日期减去间隔,返回日期 _DIFF 后缀用于获取两个日期之间的差异,返回间隔(顺便说一句,请注意,只有第一个具有反向模拟:的 _add

+/-符号将用于第一个(ADD / SUB),因此MYSQL期望将间隔作为第二个参数。

DATE = DATE_ADD(DATE,INTERVAL)    Also accepts +
DATE = DATE_SUB(DATE,INTERVAL)    Also accepts -
INTERVAL = DATE_DIFF(DATE,DATE ) 

请参阅文档here,该位从:

开始
Date arithmetic also can be performed using INTERVAL 
together with the + or - operator... 

因此,使用 - 来取两个日期之间的差异是不正确的。现在,MYSQL在面对不正确的输出时,会尝试做出最好的猜测(而不是抛出错误),有时这样做会很顺利,有时候不会。