mysql now() 列的日期时间值不正确 - 错误代码 1292

Str*_*aff 3 mysql warnings

使用 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)
Run Code Online (Sandbox Code Playgroud)

它经常奏效,但有时,...

    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)
Run Code Online (Sandbox Code Playgroud)

有时即使在意料之中,也不会给出选择结果。

Str*_*aff 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)
Run Code Online (Sandbox Code Playgroud)

一切都很好,但是...

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)
Run Code Online (Sandbox Code Playgroud)

显示 92 秒的时间戳(看起来像时间戳)。

原来我需要做一些更像

select cdrstatuschangets from cdrs where ( cdrstatuschangets < now() - INTERVAL 50 SECOND );
Run Code Online (Sandbox Code Playgroud)

但“伤害”的是问题的间歇性。