2009-09-25 87 views
2

做时使用简单的数学NOW()...MySQL的NOW()列不正确的时间值 - 错误代码1292

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) 

经常的工作,但有时,...

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) 

,有时尽管预期会出现选择结果。

回答

4

有一个阴险的问题做用简单的数学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来代替可靠性和可读性。

+0

好的,可能会这样做,但我的问题是“简单的数学”机制的不可靠性。如果它没有实际用途,或者不能被依赖,那么它确实应该被当作语法错误或其他东西拒绝。 – Straff 2009-10-12 03:26:18

+0

@Straff:完全同意。 – 2009-10-12 08:58:44