2010-10-21 11 views
51

Zum Beispiel die folgende Abfrage funktioniert gut:mysql Datetime-Vergleich

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

Aber das ist natürlich ein ‚String‘ Vergleich der Durchführung - ich frage mich, ob es eine Funktion, um MySQL gebaut wurde, die speziell tut ‚Datetime‘ Vergleiche.

Antwort

104

... dies offensichtlich führt einen ‚string‘ Vergleich

Nein - wenn das Datum/Uhrzeit-Format das unterstützte Format übereinstimmt, MySQL implizite Konvertierung führt den Wert in einen DATETIME- zu konvertieren basierend auf der Spalte, mit der es verglichen wird. Dasselbe geschieht mit:

WHERE int_column = '1' 

... wo der String-Wert von "1" in eine ganze Zahl umgewandelt wird, weil int_column ‚s Datentyp INT, nicht CHAR/VARCHAR/TEXT.

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

Wenn Ihr Server oder Strings gefunden sind nicht in UTC sei vorsichtig, da die implizite Konvertierung mit dem Server/den Sessions time_zone und nicht mit der Zeitzone des Wertes erfolgt, mit dem es verglichen wird. Die Zeichenfolge ist also dieselbe lokale time_zone, auch wenn Sie sie mit UTC_TIMESTAMP() vergleichen. – ClearCrescendo

+0

@ClearCrescendo: Guter Punkt, thx. –

18

Aber das ist natürlich ein ‚String‘ Vergleich

Nr Der String wird die Durchführung automatisch in einen DATETIME- Wert gegossen.

Siehe 11.2. Type Conversion in Expression Evaluation.

Wenn ein Operator mit Operanden verschiedenen Typen verwendet wird, tritt Typumwandlung auf die Operanden kompatibel zu machen. Einige Konvertierungen finden implizit statt. Zum Beispiel konvertiert MySQL Zahlen automatisch nach Bedarf in Zeichenfolgen und umgekehrt.

0

Ich weiß, es ist ziemlich alt, aber ich treffe nur das Problem, und es ist das, was ich in der Säge:

Wenn Sie die Zeichenfolge in einem DATETIME- explizit zu konvertieren, würde die STR_TO_DATE function die beste Wahl sein SQL doc:

[Für beste Ergebnisse bei Verwendung von BETWEEN mit Datums- oder Uhrzeitwerten] verwenden Sie CAST(), um die Werte explizit in den gewünschten Datentyp zu konvertieren. Beispiele: Wenn Sie einen DATETIME-Wert mit zwei DATE-Werten vergleichen, konvertieren Sie die DATE-Werte in DATETIME-Werte. Wenn Sie eine Zeichenfolge-Konstante wie "2001-1-1" in einem Vergleich zu einem DATUM verwenden, umwandeln Sie die Zeichenfolge an einem DATUM.

Ich nehme an, es ist besser STR_TO_DATE zu verwenden, da sie die Zeit eine Funktion nur machen nahm dafür und auch die Tatsache, dass ich dies in der BETWEEN doc ...