Betrachten Sie die folgenden zwei Möglichkeiten, um eine Datums- / Uhrzeit-Varchar-Zeichenfolge in ein Datumsfeld zu konvertieren:
SELECT convert(date, '2012-12-21 21:12:00', 20) -- Only date is needed
SELECT cast('2012-12-21 21:12:00' as date) -- Only date is needed
Beide geben zurück, was ich erwarte: Das Datum ohne Uhrzeit als Datumsdatentyp.
Meine Frage ist: Gibt es Vor- und Nachteile, wie auch immer?
Antworten:
Die (früher) akzeptierte Antwort
istwar falsch wie esistwar ein schlechter und irreführender Test. Die beiden verglichenen Abfragen machen aufgrund eines einfachen Tippfehlers, der dazu führt, dass sie kein Apfel-zu-Apfel-Vergleich sind, nicht dasselbe. Der Test in der akzeptierten Antwort ist zu Unrecht zugunsten derCAST
Operation voreingenommen . Das Problem ist, dass dieCONVERT
Operation ausgeführt wirdconvert(date, GETDATE()+num,20)
- ein Wert zum Konvertieren, der sich pro Zeile ändert -, während dieCAST
Operation mit einem einfachencast(GETDATE() as date)
Wert ausgeführt wird - ein Wert zum Konvertieren, der über alle Zeilen hinweg konsistent ist und im Ausführungsplan ersetzt wird als Konstante. Wenn Sie sich den XML-Ausführungsplan ansehen, wird sogar die tatsächlich ausgeführte Operation alsCONVERT(date,getdate(),0)
!! angezeigt.Soweit meine Tests zeigen (nachdem sie durch Verwendung gleich gemacht wurden
cast(GETDATE()+num as date)
), sind die Zeiten, in denen sie variieren, größtenteils gleich (was sinnvoll ist, wenn beideCONVERT
sowieso reduziert sind ) oder derCONVERT
Gewinn:Der Hauptunterschied zwischen CAST und CONVERT besteht darin,
CONVERT
dass der "Stil" angegeben werden kann. Der "Stil" ermöglicht nicht nur das Anpassen der Ausgabe beim Konvertieren eines Nicht-Strings in einen String, sondern auch das Festlegen des Eingabeformats beim Konvertieren eines Strings in einen Nicht-String:Vergleichen Sie das nun funktional mit
CAST
:Eine weitere Sache, die Sie erwähnen sollten
CAST
: Da der Parameter "style" nicht vorhanden ist, wird angenommen, dass das Format der übergebenen Datumszeichenfolge das der aktuellen Kultur ist (eine Sitzungseigenschaft). Die aktuelle Kultur wird durch die Systemvariablen@@LANGID
und@@LANGUAGE
bezeichnet. Dies bedeutet, dass dieCAST
Aussage, die im Test direkt oben fehlgeschlagen ist, für eine andere Kultur / Sprache erfolgreich sein kann. Die folgenden Tests zeigen dieses Verhalten und wie dieselbe Datumszeichenfolge funktioniert,CAST
wenn die aktuelle Sprache "Französisch" ist (und mit mehreren anderen funktionieren würde, basierend auf den Werten in derdateformat
Spalte insys.syslanguages
):quelle
Mir sind keine Leistungsunterschiede zwischen den beiden bekannt. Anscheinend ist "CONVERT" SQL Server-spezifisch, während CAST ANSI-Standard ist. Ich glaube, CONVERT bietet Ihnen mehr Möglichkeiten. Weitere Vor- und Nachteile finden Sie hier ( http://searchsqlserver.techtarget.com/tip/The-difference-between-CONVERT-and-CAST-in-SQL-Server ).
Direkte Zitate vom Link ...
quelle
CONVERT()
ich sicherstellen, dass der Stil 20 verwendet wird.CAST(string AS DATE)
kann von verschiedenen Einstellungen für Gebietsschema / Sprachverbindung / Datenbank / Instanz abhängen.CAST
ist abhängig von derLANGUAGE
Sitzungseigenschaft. Ich habe meiner Antwort gerade einen Abschnitt (unter der Zeile) hinzugefügt, der dies veranschaulicht.Ich habe diesen dummen Vergleich versucht. Bearbeitet gab es einen Tippfehler, den @srutzky ansprach. Die Ergebnisse sind nah.
Die Ergebnisse waren sehr konsistent:
quelle