2009-09-25 5 views
2

Lorsque vous effectuez les mathématiques simples à l'aide maintenant() ...mysql maintenant() Valeur datetime incorrecte pour la colonne - code d'erreur 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) 

souvent travaillé, mais parfois, ...

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) 

et parfois ne donnerait pas de résultats de sélection en dépit d'être attendu.

Répondre

4

Il y a un problème insidieux fait les mathématiques simples à l'aide maintenant() ... soustraction de secondes et minutes, etc sont basés sur 100 secondes dans une minute, et 100 minutes dans une heure ...

Parfois, il semble travail et d'autres fois pas. Insidieux.

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) 

tout bon, mais ...

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) 

Affiche un horodatage (ce qui ressemble à un horodatage) avec 92 secondes.

s'avère que je devais faire quelque chose plus comme

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

mais c'est la nature intermittente du problème « mal ».

1

Je recommande d'utiliser DateAdd à la place, à la fois pour la fiabilité et la lisibilité.

+0

ok, fera probablement cela, mais le problème que j'ai est le manque de fiabilité du mécanisme "maths simples". Si elle n'a pas d'utilisation pratique, ou ne peut pas être invoquée alors elle devrait vraiment être rejetée comme erreur de syntaxe ou quelque chose. – Straff

+0

@Straff: Entièrement d'accord. –

Questions connexes