web-dev-qa-db-fra.com

comparaison date-heure mysql

Par exemple, la requête suivante fonctionne bien:

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

Mais il s’agit bien évidemment d’une comparaison «chaîne» - je me demandais s’il existait une fonction intégrée à MySQL qui effectue spécifiquement des comparaisons «datetime».

57
GSTAR

... c'est évidemment effectuer une comparaison 'chaîne' 

Non - si le format de 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 elle est comparée. La même chose arrive avec:

WHERE int_column = '1'

... où la valeur de chaîne "1" est convertie en un INTeger car le type de données de int_column est INT, et non de 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')
111
OMG Ponies

Mais cela est évidemment en train de faire une comparaison 'chaîne' 

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

Voir 11.2. Conversion de type dans l'évaluation de l'expression.

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

19
Pekka 웃

Je sais que c'est assez ancien, mais je viens de rencontrer le problème et voici ce que j'ai vu dans la doc SQL: 

[Pour des résultats optimaux 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 avec une date, transformez la chaîne en une date.

Je suppose qu'il vaut mieux utiliser STR_TO_DATE car ils ont pris le temps de créer une fonction rien que pour ça et aussi parce que j'ai trouvé cela dans le document BETWEEN ...

0
guillaume latour