mysql comparaison de datetime

Par exemple, la requête suivante fonctionne correctement:

SELECT * FROM quotes WHERE expires_at <= '2010-10-15 10:00:00'; 

Mais il s’agit évidemment d’une comparaison de type «chaîne» – je me demandais s’il y avait une fonction intégrée à MySQL qui effectuait spécifiquement des comparaisons «datetime».

… c’est évidemment une comparaison de “chaîne”

Non – si le format date / heure correspond au format pris en charge, MySQL effectue une conversion implicite pour convertir la valeur en DATETIME, en fonction de la colonne à laquelle il est comparé. La même chose arrive avec:

 WHERE int_column = '1' 

… où la valeur de chaîne de “1” est convertie en un INTeger car le type de données int_column est INT et non CHAR / VARCHAR / TEXT.

Si vous voulez convertir explicitement la chaîne en DATETIME, la fonction STR_TO_DATE serait le meilleur choix:

 WHERE expires_at <= STR_TO_DATE('2010-10-15 10:00:00', '%Y-%m-%d %H:%i:%s') 

Mais c’est évidemment une comparaison de “chaîne”

La chaîne sera automatiquement convertie en une valeur DATETIME.

Voir 11.2. Conversion de type en évaluation d’expression.

Lorsqu’un opérateur est utilisé avec des opérandes de types différents, une conversion de type est effectuée pour rendre les opérandes compatibles. Certaines conversions se produisent implicitement. Par exemple, MySQL convertit automatiquement les nombres en chaînes si nécessaire, et inversement.

Je connais son ancien mais je rencontre juste le problème et il y a ce que j’ai vu dans le doc SQL:

[Pour de meilleurs résultats lors de l’utilisation de BETWEEN avec des valeurs de date ou d’heure,] utilisez CAST () pour convertir explicitement les valeurs dans le type de données souhaité. Exemples: Si vous comparez un DATETIME à deux valeurs DATE, convertissez les valeurs DATE en valeurs DATETIME. Si vous utilisez une constante de chaîne telle que «2001-1-1» dans une comparaison à une date, convertissez la chaîne en DATE.

Je suppose qu’il vaut mieux utiliser STR_TO_DATE car ils ont pris le temps de faire une fonction juste pour cela et aussi le fait que je l’ai trouvé dans le document BETWEEN …