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

edm*_*dmz 5 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                           |
+---------------------------+------------------------------------+
Run Code Online (Sandbox Code Playgroud)

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

Cod*_*aft 8

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

试试这个:

SELECT (20110413155959 - 20110413160000) AS dates;
Run Code Online (Sandbox Code Playgroud)

你的日期,没有阻止他们成为数字的所有东西 - 结果是-4041


leo*_*loy 6

回想一下,mysql有两种不同类型的与datetime相关的子类:_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 ) 
Run Code Online (Sandbox Code Playgroud)

请参阅此处的doc ,从以下位置开始:

Date arithmetic also can be performed using INTERVAL 
together with the + or - operator... 
Run Code Online (Sandbox Code Playgroud)

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