In SQL Server können Sie die T-SQL-Funktion FORMAT()
verwenden, um Werte wie Zahlen und Datumsangaben als formatierte Zeichenketten zurückzugeben.
Sie geben den zu formatierenden Wert und das zu verwendende Format an. Die Funktion akzeptiert ein optionales Argument, mit dem Sie eine Kultur angeben können, die bei der Formatierung des Wertes verwendet werden soll.
Syntax
Die Syntax sieht folgendermaßen aus:
FORMAT ( value, format )
Wobei value
der Wert ist, der formatiert werden soll, und format
eine gültige Formatzeichenfolge ist, die das gewünschte Format angibt.
Das optionale Argument culture
kann verwendet werden, um eine Kultur anzugeben. Wird es weggelassen, wird die Sprache der aktuellen Sitzung verwendet.
Die Funktion FORMAT
ist nicht deterministisch.
Beispiel 1 – Eine Zahl formatieren
Hier ist ein Beispiel für die Formatierung einer Zahl:
SELECT FORMAT(1, 'N') AS Result;
Ergebnis:
+----------+| Result ||----------|| 1.00 |+----------+
In diesem Fall habe ich N
als Formatzeichenfolge verwendet. Dies ist ein standardmäßiger numerischer Formatbezeichner für die Ausgabe des Wertes als Zahl. Dieser spezielle Formatbezeichner führt dazu, dass die Ausgabe mit ganzen und dezimalen Ziffern, Gruppentrennzeichen und einem Dezimaltrennzeichen mit optionalem negativen Vorzeichen formatiert wird. Die Groß- und Kleinschreibung wird nicht beachtet, also ist entweder N
oder n
in Ordnung.
Beispiel 2 – Zu einer Währung formatieren
Hier ist ein Beispiel für die Formatierung einer Zahl als Währung:
SELECT FORMAT(1, 'C') AS Result;
Ergebnis:
+----------+| Result ||----------|| $1.00 |+----------+
Mehr Zahlenformate
Es gibt noch viele weitere Formatzeichenfolgen, die mit der Funktion FORMAT()
verwendet werden können. Zum Beispiel gibt es Format-Strings für Prozent, Festkomma, Exponential (wissenschaftlich), Hexadezimal und mehr.
Die numerischen Formatzeichenketten werden in Standard und Benutzerdefiniert unterschieden.
In den folgenden beiden Artikeln werden alle numerischen Formatzeichenfolgen mit Beispielen aufgelistet:
- Standard-Zahlenformatzeichenfolgen
- Benutzerdefinierte Zahlenformatzeichenfolgen
Weitere Beispiele für die Formatierung von Zahlen finden Sie auch unter Wie man Zahlen in SQL Server formatiert.
Beispiel 3 – Formatieren eines Datums
Hier ist ein Beispiel für die Formatierung eines Datums:
SELECT GETDATE() AS 'Unformatted Date', FORMAT( GETDATE(), 'D') AS 'Formatted Date';
Ergebnis:
+-------------------------+------------------------+| Unformatted Date | Formatted Date ||-------------------------+------------------------|| 2019-05-08 06:16:55.613 | Wednesday, May 8, 2019 |+-------------------------+------------------------+
In diesem Fall habe ich D
verwendet, das ein langes Datumsmuster angibt.
Weitere Datumsformate
Es gibt noch viele weitere Format-Strings, die zur Formatierung von Datumsangaben verwendet werden können. Wie bei den numerischen Formatzeichenketten werden auch die Datums- und Zeitformatzeichenketten in Standard- und benutzerdefinierte Zeichenketten unterteilt, so dass Sie Ihre eigenen benutzerdefinierten Formate erstellen oder auf ein Standardformat zurückgreifen können.
In den folgenden beiden Artikeln sind alle Datums- und Zeitformatzeichenfolgen mit Beispielen aufgeführt:
- Standard-Datums- und Zeitformatzeichenfolgen
- Benutzerdefinierte Datums- und Zeitformatzeichenfolgen
Weitere Beispiele finden Sie auch unter Wie man das Datum & Zeit in SQL Server formatiert.
Beispiel 4 – Das optionale Kultur-Argument
Hier ist ein Beispiel für die Verwendung des culture
-Arguments, um einen Wert in verschiedenen Währungen zurückzugeben:
SELECT FORMAT(1, 'C', 'fr-FR') AS 'France', FORMAT(1, 'C', 'th-TH') AS 'Thailand', FORMAT(1, 'C', 'ja-JP') AS 'Japan';
Ergebnis:
+----------+------------+---------+| France | Thailand | Japan ||----------+------------+---------|| 1,00 € | ฿1.00 | ¥1 |+----------+------------+---------+
Die FORMAT()
-Funktion akzeptiert jede Kultur, die vom .NET Framework unterstützt wird, als Argument; sie ist nicht auf die von SQL Server explizit unterstützten Sprachen beschränkt.
Wenn Sie dieses Argument nicht angeben, wird die Sprache der aktuellen Sitzung verwendet.
Weitere Beispiele finden Sie unter Wie Spracheinstellungen Ihre FORMAT()
Ergebnisse beeinflussen können.
Beispiel 5 – Ungültiges Kultur-Argument
Wenn Sie eine ungültige Kultur angeben, erhalten Sie einen Fehler:
SELECT FORMAT(1, 'C', 'oop-SS!') AS 'Oops!';
Ergebnis:
The culture parameter 'oop-SS!' provided in the function call is not supported.
Beispiel 6 – Ungültiger Formatwert
Bei anderen Fehlern liefert die Funktion jedoch NULL
. Das passiert zum Beispiel, wenn ich einen ungültigen Wert zum Formatieren anbiete:
SELECT FORMAT(GETDATE(), 'C') AS 'Result';
Ergebnis:
+----------+| Result ||----------|| NULL |+----------+
In diesem Fall habe ich versucht, ein Datum in eine Währung zu formatieren, und deshalb war das Ergebnis NULL
.
Gültige Datentypen
FORMAT()
verlässt sich auf das Vorhandensein der .NET Framework Common Language Runtime (CLR) und verwendet die CLR-Formatierungsregeln.
Die folgenden Datentypen können mit der FORMAT()
-Funktion formatiert werden. Diese Liste enthält die akzeptablen Datentypen für den Eingabestring zusammen mit ihren .NET Framework Mapping-Äquivalenztypen.
Kategorie | Typ | .NET-Typ |
---|---|---|
Numerisch | bigint | Int64 | Numerisch | int | Int32 | Numerisch | smallint | Int16 | Numerisch | tinyint | Byte |
Numerisch | Dezimal | SqlDecimal | Numerisch | Numerisch | SqlDecimal |
Numerisch | Float | Double |
Numerisch | real | Single | Numerisch | smallmoney | Decimal |
Numerisch | Geld | Dezimal |
Datum und Uhrzeit | Datum | DateTime |
Datum und Uhrzeit | Zeit | TimeSpan |
Datum und Uhrzeit | datetime | DateTime |
Datum und Uhrzeit | smalldatetime | DateTime |
Datum und Uhrzeit | datetime2 | DateTime |
Datum und Uhrzeit | datetimeoffset | DateTimeOffset |
Escaping von Doppelpunkten und Punkten für den Datentyp ‚time‘
Bei Verwendung von FORMAT
, müssen Doppelpunkte und Punkte escaped werden (dies entspricht den Formatierungsregeln der CLR). Wenn also der Format-String (zweiter Parameter) einen Doppelpunkt oder einen Punkt enthält, muss der Doppelpunkt oder der Punkt mit einem Backslash escaped werden, wenn ein Eingabewert (erster Parameter) vom Datentyp Zeit ist.
Beispiel:
SELECT CAST('12:15' AS time) AS 'Unformatted Data', FORMAT(CAST('12:15' AS time), N'hh.mm') AS 'Unescaped', FORMAT(CAST('12:15' AS time), N'hh\.mm') AS 'Escaped';
Ergebnis:
+--------------------+-------------+-----------+| Unformatted Data | Unescaped | Escaped ||--------------------+-------------+-----------|| 12:15:00 | NULL | 12.15 |+--------------------+-------------+-----------+
Der unescapte String liefert also erwartungsgemäß NULL
.
Wie erwähnt, gilt dies nur für den Datentyp Zeit. Wenn wir den Eingabewert in einen anderen Datentyp ändern, brauchen wir ihn nicht zu escapen:
SELECT CAST('12:15' AS datetime) AS 'Unformatted Data', FORMAT(CAST('12:15' AS datetime), N'hh.mm') AS 'Unescaped', FORMAT(CAST('12:15' AS datetime), N'hh.mm') AS 'Escaped';
Ergebnis:
+-------------------------+-------------+-----------+| Unformatted Data | Unescaped | Escaped ||-------------------------+-------------+-----------|| 1900-01-01 12:15:00.000 | 12.15 | 12.15 |+-------------------------+-------------+-----------+
In diesem Fall ist der Eingabewert datetime, und daher ist das Ergebnis in Ordnung, ohne es zu escapen.
Sie können den Backslash auch verwenden, um ein beliebiges anderes Zeichen zu escapen, das in der Ergebniszeichenkette enthalten sein soll und sonst als Formatspezifikation interpretiert werden würde. Das Voranstellen eines Zeichens mit einem Backslash bedeutet, dass das folgende Zeichen ein Zeichenliteral ist, das unverändert in die Ergebniszeichenkette aufgenommen werden soll.
In einer benutzerdefinierten Datums- und Zeitformatzeichenkette werden die d
f
F
g
h
H
K
m
M
s
t
y
z
:
, oder /
Zeichen werden als benutzerdefinierte Formatspezifikationen und nicht als literale Zeichen interpretiert.
In einer benutzerdefinierten numerischen Formatzeichenkette werden die #
0
.
,
%
und ‰
werden als Formatbezeichner und nicht als literale Zeichen interpretiert. Die Groß- und Kleinbuchstaben E
sowie die Symbole +
und -
können je nach ihrer Position innerhalb der Formatzeichenkette ebenfalls als Formatspezifikation interpretiert werden.
Wenn Sie einen Backslash in den Ergebnisstring einfügen müssen, geben Sie ihn mit einem weiteren Backslash aus.
Remoting
Die Funktion FORMAT()
kann nicht remoted werden, da sie vom Vorhandensein der CLR abhängig ist. Das Remoten einer Funktion, die die CLR benötigt, könnte einen Fehler auf dem Remote-Server verursachen.
Wann sollte die Funktion FORMAT() verwendet werden
Microsoft empfiehlt, dass die Funktion FORMAT()
für die lokalisierte Formatierung von Datums-/Zeit- und Zahlenwerten als Strings verwendet wird, und dass für allgemeine Datentypkonvertierungen entweder die CAST()
-Funktion oder die CONVERT()
-Funktion verwendet werden sollte.