Vielleicht sind Sie schon einmal auf das T-SQL PARSE()
gestoßen , CAST()
, und CONVERT()
Funktionen bei der Arbeit mit SQL Server und fragte mich, was der Unterschied ist. Alle drei Funktionen scheinen dasselbe zu tun, aber es gibt subtile Unterschiede zwischen ihnen.
In diesem Artikel möchte ich die Hauptunterschiede zwischen diesen Funktionen skizzieren.
Vergleich
In der folgenden Tabelle sind die Hauptunterschiede zwischen CONVERT()
aufgeführt , CAST()
, und PARSE()
Funktionen in SQL Server:
CONVERT() | CAST() | PARSE() | |
---|---|---|---|
Offizielle Definition | Konvertiert einen Ausdruck eines Datentyps in einen anderen. | Konvertiert einen Ausdruck eines Datentyps in einen anderen. | Gibt das Ergebnis eines Ausdrucks zurück, übersetzt in den angeforderten Datentyp in SQL Server. |
Akzeptierter Wert | Jeder gültige Ausdruck. | Jeder gültige Ausdruck. | Zeichenfolge. |
Rückgabewert | 2. Argument, übersetzt in den angeforderten Datentyp, wie vom 1. Argument angegeben. | 1. Argument, übersetzt in den angeforderten Datentyp, wie vom 2. Argument angegeben. | 1. Argument, übersetzt in den angeforderten Datentyp, wie vom 2. Argument angegeben. |
Unterstützte Konvertierungen | Zwischen zwei beliebigen Datentypen. | Zwischen zwei beliebigen Datentypen. | Von Zeichenkette bis Datum/Uhrzeit und nur Zahlentypen. |
Akzeptiert den Stil Argument? | Ja. | Nein. | Nein. |
Akzeptiert die Kultur Argument? | Nein. | Nein. | Ja. |
Erfordert .NET Framework? | Nein. | Nein. | Ja. |
Einige andere Punkte zusätzlich zu der obigen Tabelle:
- Die Microsoft-Dokumentation weist darauf hin, dass
PARSE()
wird nicht entfernt (da dies vom Vorhandensein der CLR abhängt). Das Remoting einer Funktion, die die CLR erfordert, würde einen Fehler auf dem Remoteserver verursachen. - Es gibt einige Werte, die
PARSE()
werden kann aber mitCAST()
umgehen undCONVERT()
kann nicht (z. B. Zeichenfolgen mit bestimmten Datumsformaten). CAST()
ist im ANSI SQL-92-Standard enthalten.- Einige argumentieren, dass
CAST()
hat eine bessere Leistung als die anderen beiden. - Beim Analysieren von Zeichenfolgenwerten gibt es einen gewissen Leistungsaufwand. Daher
PARSE()
läuft normalerweise langsamer als die anderen beiden.
Nachfolgend finden Sie Beispiele für Situationen, in denen die einzelnen Funktionen am besten geeignet sind.
Wann CAST() verwendet werden sollte
Ein gutes Argument könnte für die Verwendung von CAST()
angeführt werden für jedes Szenario, das unten nicht aufgeführt ist. Wie bereits erwähnt, CAST()
ist seit SQL-92 Teil des ANSI-SQL-Standards, daher sollte es besser zwischen verschiedenen DBMSs portierbar sein (falls dies erforderlich ist).
Einige argumentieren auch, dass CAST()
hat eine bessere Leistung als die anderen beiden (hier ist ein interessanter Artikel, der die Leistung aller drei Funktionen vergleicht).
Es gibt jedoch auch triftige Gründe, warum Sie die Verwendung von CONVERT()
bevorzugen (oder müssen). über CAST()
.
Wann CONVERT() verwendet werden sollte
Das CONVERT()
Funktion kann sich als nützlich erweisen, wenn Sie den style
verwenden müssen -Argument, um anzugeben, wie das Datum formatiert werden soll, wenn zwischen einem Datum und einer Zeichenfolge konvertiert wird. Hier sind einige Beispiele:
DECLARE @date datetime2 = '2018-06-07 02:35:52.8537677'; SELECT CONVERT(nvarchar(30), @date, 100) AS '100', CONVERT(nvarchar(30), @date, 101) AS '101', CONVERT(nvarchar(30), @date, 102) AS '102', CONVERT(nvarchar(30), @date, 103) AS '103';
Ergebnis:
+---------------------+------------+------------+------------+ | 100 | 101 | 102 | 103 | |---------------------+------------+------------+------------| | Jun 7 2018 2:35AM | 06/07/2018 | 2018.06.07 | 07/06/2018 | +---------------------+------------+------------+------------+
Das geht nur mit CONVERT()
weil:
CAST()
unterstützt denstyle
nicht Streit; undPARSE()
konvertiert nicht von einem Datum/einer Uhrzeit in einen Zeichenfolgenwert (es unterstützt auch nicht denstyle
Argument)
Wann sollte PARSE() verwendet werden
Trotz der verschiedenen Nachteile dieser Funktion (Leistung, Abhängigkeit von .NET, begrenzte Datentypkonvertierungen) hat sie auch einige Vorteile, und es gibt einige Szenarien, in denen sie Ihre einzige Wahl sein könnte. Wenn Sie beispielsweise ein Datum angeben, das den Namen des Wochentags enthält, wie Freitag, 20. Juli 2018 .
Wenn die Anderen einen Fehler zurückgeben
Hier sind Beispiele, bei denen PARSE()
ist die einzige der drei Funktionen, die den Wert erfolgreich umwandeln kann, ohne einen Fehler auszulösen.
In diesen Beispielen versuchen wir, verschiedene Zeichenfolgenwerte in ein Datum umzuwandeln Datentyp. Die von uns bereitgestellten Zeichenfolgenwerte enthalten jedoch den Namen des Wochentags. Dies verursacht Probleme für CAST()
und CONVERT()
, aber PARSE()
kein Problem.
PARSE()
SELECT PARSE('Friday, 20 July 2018' AS date) AS 'Result 1', PARSE('Fri, 20 July 2018' AS date) AS 'Result 2', PARSE('Friday 20 July 2018' AS date) AS 'Result 3';
Ergebnis:
+------------+------------+------------+ | Result 1 | Result 2 | Result 3 | |------------+------------+------------| | 2018-07-20 | 2018-07-20 | 2018-07-20 | +------------+------------+------------+
Also PARSE()
hat kein Problem mit dem Datumsformat, das wir bereitstellen.
CONVERT()
SELECT CONVERT(date, 'Friday, 20 July 2018') AS 'Result 1', CONVERT(date, 'Fri, 20 July 2018') AS 'Result 2', CONVERT(date, 'Friday 20 July 2018') AS 'Result 3';
Ergebnis:
Conversion failed when converting date and/or time from character string.
Also CONVERT()
kann die Zeichenfolge nicht konvertieren, wenn sie in einem solchen Format vorliegt.
CAST()
SELECT CAST('Friday, 20 July 2018' AS date) AS 'Result 1', CAST('Fri, 20 July 2018' AS date)AS 'Result 2', CAST('Friday 20 July 2018' AS date) AS 'Result 3';
Ergebnis:
Conversion failed when converting date and/or time from character string.
Und CAST()
gibt denselben Fehler zurück.
Wenn Sie also feststellen, dass Sie Fehler mit den anderen beiden Funktionen erhalten, versuchen Sie es mit PARSE()
stattdessen.
Kultur angeben
Ein weiteres Szenario, in dem Sie möglicherweise lieber PARSE()
verwenden Funktion ist, wenn die Kultur/Sprache angegeben wird, in der die Zeichenfolge bereitgestellt wird. PARSE()
verfügt über ein optionales Argument, mit dem Sie angeben können, welche Kultur verwendet werden soll. Wenn weggelassen, wird die Sprache der aktuellen Sitzung verwendet.
Beispiel für die Einbeziehung von culture
Argument:
SELECT PARSE('07/01/2018' AS date USING 'en-US') AS 'Result 1', PARSE('07/01/2018' AS date USING 'de-DE') AS 'Result 2';
Ergebnis:
+------------+------------+ | Result 1 | Result 2 | |------------+------------| | 2018-07-01 | 2018-01-07 | +------------+------------+
Eine kulturelle Alternative
Trotz des Vorteils, die Kultur mit PARSE()
angeben zu können haben Sie die Möglichkeit, die Spracheinstellungen zu ändern, was bedeutet, dass Sie den gleichen Effekt erzielen könnten, wenn Sie CAST()
verwenden oder CONVERT()
.
Verwenden Sie beispielsweise SET LANGUAGE us_english
vor der Abfrage ändert die aktuellen Spracheinstellungen auf us_english . Dies erlaubt Ihnen zwar nicht, verschiedene Kulturen innerhalb der Abfrage anzugeben (wie im obigen Beispiel), wirkt sich jedoch auf die gesamte Abfrage (und alle nachfolgenden Abfragen) aus.
Auf die gleiche Weise können Sie auch die Einstellungen für das Datumsformat ändern. Beispiel:SET DATEFORMAT mdy
.
Hier ist ein Beispiel für das Ändern der Spracheinstellung vor dem Ausführen einer Abfrage mit CAST()
und CONVERT()
:
Deutsch:
SET LANGUAGE German; SELECT CONVERT(date, '07/01/2018') AS 'Convert'; SELECT CAST('07/01/2018' AS date) AS 'Cast';
Ergebnis:
+------------+ | Convert | |------------| | 2018-01-07 | +------------+ Die Spracheneinstellung wurde in Deutsch geändert. +------------+ | Cast | |------------| | 2018-01-07 | +------------+
us_english:
SET LANGUAGE us_english; SELECT CONVERT(date, '07/01/2018') AS 'Convert'; SELECT CAST('07/01/2018' AS date) AS 'Cast';
Ergebnis:
+------------+ | Convert | |------------| | 2018-07-01 | +------------+ Changed language setting to us_english. +------------+ | Cast | |------------| | 2018-07-01 | +------------+
Denken Sie daran, dass Sie dabei die Sprach-/Datumsformatumgebung für die Sitzung ändern. Vergessen Sie nicht, es wieder zu ändern!