MySQL now()函数在列中的日期时间值不正确 - 错误代码1292

3

当使用now()进行简单的数学计算时...

    mysql> 
select cdrstatuschangets from cdrs where ( cdrstatuschangets < now() - 10 );
    +---------------------+
    | cdrstatuschangets   |
    +---------------------+
    | 2009-09-25 13:55:50 |
    +---------------------+
    1 row in set (0.00 sec)

    show warnings;
    Empty set (0.00 sec)

IT技术经常有效,但有时候...

    mysql> 
select cdrstatuschangets from cdrs where ( cdrstatuschangets < now() - 50 );
    +---------------------+
    | cdrstatuschangets   |
    +---------------------+
    | 2009-09-25 13:55:50 |
    +---------------------+
    1 row in set, 1 warning (0.00 sec)


show warnings;
+---------+------+-----------------------------------------------------------------------+
| Level   | Code | Message |                                                                                  |
+---------+------+-----------------------------------------------------------------------+
| Warning | 1292 | Incorrect datetime value: '20090925211564.000000' for column 'cdrStatusChangeTS' at row 1 |
+---------+------+-----------------------------------------------------------------------+
1 row in set (0.00 sec)

有时候,尽管期望有结果,但选择结果并未出现。
2个回答

6

使用 now() 进行简单数学运算时,存在一个隐蔽的问题...... 减去秒和分钟等操作基于一分钟内有 100 秒,一小时内有 100 分钟......

有时它似乎起作用,有时则不然。这是一个隐匿的问题。

mysql> select now(); select now() -10;
+---------------------+
| now()               |
+---------------------+
| 2009-09-25 21:07:20 |
+---------------------+
1 row in set (0.00 sec)

+-----------------------+
| now() -10             |
+-----------------------+
| 20090925210710.000000 |
+-----------------------+
1 row in set (0.00 sec)

一切都很好,但是...
mysql> select now(); select now() -10;
+---------------------+
| now()               |
+---------------------+
| 2009-09-25 21:08:02 |
+---------------------+
1 row in set (0.00 sec)

+-----------------------+
| now() -10             |
+-----------------------+
| 20090925210792.000000 |
+-----------------------+
1 row in set (0.00 sec)

显示一个带有92秒的时间戳(看起来像是时间戳)。

结果发现我需要做一些更像这样的事情

select cdrstatuschangets from cdrs where ( cdrstatuschangets < now() - INTERVAL 50 SECOND );

但问题的间歇性使其“伤”人。


1
我建议使用 DateAdd,这样更可靠、易读。

好的,我可能会这样做,但我遇到的问题是“简单数学”机制的不可靠性。如果它没有实际用途,或者不能被信赖,那么它真的应该被拒绝为语法错误或其他什么东西。 - Straff

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