18.11 Problèmes avec les colonnes DATE

Le format d'une colonne de type DATE est 'YYYY-MM-DD'. Suivant la norme ANSI SQL, aucun autre format n'est toléré. Il vous faut utiliser ce format dans les expressions UPDATE et dans les clauses WHERE (SELECT ). Par exemple:

mysql> SELECT * FROM nom_table WHERE date >= '1997-05-05';

De manière pratique, MySQL converti automatiquement une date en nombre si la date est utilisée dans un contexte numérique (et vice versa). Il est aussi capable d'utiliser une forme non conventionnelle lors des modification, ou dans les clauses WHERE lors de comparaisons avec des colonnes de type TIMESTAMP, DATE ou DATETIME. (Non conventionnelle signifie ici que des caractères non numériques peuvent être utilisé ici. Par exemple, '1998-08-15' et '1998#08#15' sont équivalents.) MySQL peut aussi convertir une chaîne ne contenant pas de séparateur en date, en supposant que cela puisse avoir un sens, comme '19980815'.

La date particulière de '0000-00-00' peut être enregistrée et lue sous la forme de '0000-00-00'. Lorsque vous utilisez une date telle que '0000-00-00' avec MyODBC, elle sera automatiquement converti en NULL par MyODBC 2.50.12 et plus récent, car ODBC ne peut pas gérer ce genre de date.

Etant donné que MySQL effectue les conversions précédentes, les exemples suivant fonctionnent :

mysql> INSERT INTO nom_table (idate) VALUES (19970505);
mysql> INSERT INTO nom_table (idate) VALUES ('19970505');
mysql> INSERT INTO nom_table (idate) VALUES ('97-05-05');
mysql> INSERT INTO nom_table (idate) VALUES ('1997.05.05');
mysql> INSERT INTO nom_table (idate) VALUES ('1997 05 05');
mysql> INSERT INTO nom_table (idate) VALUES ('0000-00-00');
mysql> SELECT idate FROM nom_table WHERE idate >= '1997-05-05';
mysql> SELECT idate FROM nom_table WHERE idate >= 19970505;
mysql> SELECT mod(idate,100) FROM nom_table WHERE idate >= 19970505;
mysql> SELECT idate FROM nom_table WHERE idate >= '19970505';

However, the following will not work:

mysql> SELECT idate FROM nom_table WHERE STRCMP(idate,'19970505')=0;

STRCMP() est une fonction de chaîne de caractère, qui va convertir idate en chaîne et effectuer une comparaison de type chaîne. to a string. Par contre, il ne va pas convertir '19970505' en date, et effectuer la comparaison.

Notez aussi que MySQL ne s'assure pas qu'une date est correcte ou pas. Si vous enregistrez une date incorrecte telle que '1998-2-31', cette date sera enregistrée. Si une date ne peut pas être converti raisonnablement, elle sera remplacée par 0 lors de l'enregistrement. Cette technique permet d'accélerer les traitement, et nous pensons que c'est à l'application de vérifier les dates, et non pas au serveur.