Es kann leicht vergessen werden, dass T-SQL FORMAT()
-Funktion bietet gebietsschemaabhängige Formatierung. Gebietsschemaabhängig bedeutet, dass das Gebietsschema die Ergebnisse beeinflussen kann. Mit anderen Worten, die genaue Ausgabe, die Sie erhalten, hängt vom Gebietsschema ab.
Standardmäßig verwendet die Funktion die Sprache der aktuellen Sitzung, um das Gebietsschema zu bestimmen. Dies kann jedoch überschrieben werden, indem ein „Kultur“-Argument an die Funktion übergeben wird. Dadurch können Sie Ergebnisse für ein bestimmtes Gebietsschema bereitstellen, ohne die Sprache der aktuellen Sitzung ändern zu müssen.
Dieser Artikel enthält Beispiele dafür, wie sich das Gebietsschema auf die Ergebnisse bei Verwendung von FORMAT()
auswirken kann Funktion in SQL Server.
Beispiel 1 – Währungen
Hier ist ein kurzes Beispiel, um zu demonstrieren, wie Sprache/Kultur Ihre Ergebnisse beim Formatieren von Zahlen beeinflussen können.
DECLARE @num decimal(6,2) =1234.56;SELECT FORMAT(@num, 'C', 'en-us') 'en-us', FORMAT(@num, 'C', 'en-gb ') 'en-gb', FORMAT(@num, 'C', 'th-th') 'th-th', FORMAT(@num, 'C', 'nl-nl') 'nl-nl', FORMAT(@num, 'C', 'ne-np') 'ne-np', FORMAT(@num, 'C', 'fa-ir') 'fa-ir';
Ergebnisse:
+-----------+-----------+-----------+---------- --+-----------+--------------+| de-us | de-de | te-te | nl-nl | ne-np | fa-ir ||---+-----------+-----------+--------- ---+------------+--------------|| 1.234,56 $ | £1.234,56 | ฿1.234,56 | € 1.234,56 | Preis 1.234,56 | 1.234/56ريال |+-----------+-----------+-----------+--------- ---+------------+--------------+
Das C
in diesem Beispiel ist ein standardmäßiger numerischer Formatbezeichner. Dieses einzelne Zeichen gibt an, dass der Wert auf eine bestimmte Weise formatiert werden soll (in diesem Fall als Währung). Glücklicherweise ist SQL Server intelligent genug, um zu wissen, dass nicht alle Kulturen dasselbe Format verwenden, und je nach Kultur automatisch ein anderes Format darstellt.
Im obigen Beispiel rufe ich jedes Mal FORMAT()
auf , übergebe ich den gleichen Wert und die gleiche Formatzeichenfolge. Der einzige Unterschied ist der Wert des Kulturarguments. Dies führt dazu, dass die Ergebnisse je nach verwendeter Kultur unterschiedlich sind. Das Währungssymbol und seine Positionierung wird durch die Kultur bestimmt. Das für Dezimaltrennzeichen und Gruppentrennzeichen verwendete Zeichen wird auch von der Kultur bestimmt.
Beispiel 2 – Negative Werte
Die Formatierung kann auch davon abhängen, ob der Wert positiv oder negativ ist. Wenn wir einen negativen Wert verwenden, passiert Folgendes:
DECLARE @num decimal(3,2) =-1.23;SELECT FORMAT(@num, 'C', 'en-us') 'en-us', FORMAT(@num, 'C', 'en- gb') 'en-gb', FORMAT(@num, 'C', 'th-th') 'th-th', FORMAT(@num, 'C', 'nl-nl') 'nl-nl' , FORMAT(@num, 'C', 'ne-np') 'ne-np', FORMAT(@num, 'C', 'fa-ir') 'fa-ir';
Ergebnisse:
+---------+---------+---------+---------+------ ---+-----------+| de-us | de-de | te-te | nl-nl | ne-np | fa-ir ||---------+---------+---------+---------+----- ----+-----------|| ($1,23) | -£1.23 | -฿1,23 | € -1,23 | -रु 1.23 | 1/23-ريال |+---------+---------+---------+---------+--- ------+-----------+
In manchen Kulturen steht das Minuszeichen vor dem Währungszeichen, in anderen steht es dahinter. Aber in anderen Kulturen gibt es überhaupt kein Minuszeichen – es wird durch Klammern ersetzt, die das gesamte Ergebnis umgeben, einschließlich des Währungszeichens.
Wir sollten jedoch nicht davon ausgehen, dass dieselben Regeln auf alle Formatzeichenfolgen angewendet werden. Wenn wir es beispielsweise als Zahl anstelle einer Währung formatieren, erhalten wir keine Klammern:
DECLARE @num decimal(3,2) =-1.23;SELECT FORMAT(@num, 'N', 'en-us') 'en-us', FORMAT(@num, 'N', 'en- gb') 'en-gb', FORMAT(@num, 'N', 'th-th') 'th-th', FORMAT(@num, 'N', 'nl-nl') 'nl-nl' , FORMAT(@num, 'N', 'ne-np') 'ne-np', FORMAT(@num, 'N', 'fa-ir') 'fa-ir';
Ergebnisse:
+---------+---------+---------+---------+------ ---+---------+| de-us | de-de | te-te | nl-nl | ne-np | fa-ir ||---------+---------+---------+---------+----- ----+---------|| -1,23 | -1,23 | -1,23 | -1,23 | -1,23 | 1/23- |+---------+---------+---------+---------+---- -----+---------+
Beispiel 3 – Daten und Uhrzeiten
Die Zahlenformatierung ist nicht das einzige, was von der Kultur beeinflusst wird. Auch Datums- und Uhrzeitangaben werden je nach Kultur unterschiedlich formatiert.
DECLARE @date datetime2(0) ='2019-06-15 13:45:30';SELECT FORMAT(@date, 'G', 'en-us') 'en-us', FORMAT(@date , 'G', 'en-gb') 'en-gb', FORMAT(@date, 'G', 'th-th') 'th-th', FORMAT(@date, 'G', 'nl- nl') 'nl-nl', FORMAT(@date, 'G', 'ne-np') 'ne-np', FORMAT(@date, 'G', 'fa-ir') 'fa-ir';
Ergebnisse (mit vertikaler Ausgabe):
en-us | 15.06.2019 13:45:30Männer-de | 15.06.2019 13:45:30 | 15/6/2562 13:45:30nl-nl | 15-6-2019 13:45:30ne-np | 15.06.2019 1:45:30 अपराह्नfa-ir | 25/03/1398 01:45:30 ب.ظ
Dieses Beispiel verwendet ein allgemeines Datums-/Langzeitformat (erreicht durch Verwendung von G
– einer der Standardbezeichner für Datums- und Zeitformate), und die Unterschiede zwischen den Kulturen sind offensichtlich.
Aber auch bei Verwendung eines langen Datumsformats können wir Unterschiede feststellen:
DECLARE @date datetime2(0) ='2019-06-15 13:45:30';SELECT FORMAT(@date, 'F', 'en-us') 'en-us', FORMAT(@date , 'F', 'en-gb') 'en-gb', FORMAT(@date, 'F', 'th-th') 'th-th', FORMAT(@date, 'F', 'nl- nl') 'nl-nl', FORMAT(@date, 'F', 'ne-np') 'ne-np', FORMAT(@date, 'F', 'fa-ir') 'fa-ir';
Ergebnisse (mit vertikaler Ausgabe):
en-us | Samstag, 15. Juni 2019 13:45:30 UhrMen-gb | 15. Juni 2019 13:45:30 | 15 มิถุนายน 2562 13:45:30nl-nl | Samstag 15. Juni 2019 13:45:30ne-np | am 15. Oktober 2019 um 1:45:30 Uhr fa-ir | April, 25. Januar 1398, 01:45:30 Uhr
Beispiel 4 – Was ist mit benutzerdefinierten Formatzeichenfolgen?
Die vorherigen Beispiele verwenden Standardformatzeichenfolgen, die die Formatierung im Wesentlichen für Sie übernehmen. Es ist wie eine Kurzform zur Angabe einer benutzerdefinierten Formatzeichenfolge. Ein benutzerdefinierter Formatbezeichner hingegen ermöglicht es Ihnen, genau anzugeben, welche Zeichen in der Ausgabe erscheinen und wohin sie gehen. Dies bedeutet jedoch normalerweise, dass Sie mehr Formatbezeichner in Ihrer Formatzeichenfolge verwenden müssen.
Aber selbst wenn Sie benutzerdefinierte Formatbezeichner verwenden, kann die genaue Ausgabe auch vom Gebietsschema abhängen. Wenn wir eine benutzerdefinierte Formatzeichenfolge für Datum und Uhrzeit verwenden möchten, um das vorherige Beispiel nachzuahmen, könnten wir etwa so vorgehen:
DECLARE @date datetime2(0) ='2019-06-15 13:45:30';FORMAT WÄHLEN(@date, 'dddd, dd MMMM yyyy hh:mm:ss tt', 'en-us') 'en-us', FORMAT(@date, 'dddd, dd MMMM yyyy hh:mm:ss tt', 'en-gb') 'en-gb', FORMAT(@date, 'dddd, dd MMMM yyyy hh:mm:ss tt', 'th-th') 'th-th', FORMAT(@date, 'dddd, dd MMMM yyyy hh:mm:ss tt', 'nl-nl') 'nl-nl', FORMAT (@date, 'dddd, dd MMMM yyyy hh:mm:ss tt', 'ne-np') 'ne-np', FORMAT(@date, 'dddd, dd MMMM yyyy hh:mm:ss tt', ' fa-ir') 'fa-ir';
Ergebnisse (mit vertikaler Ausgabe):
en-us | Samstag, 15. Juni 2019 13:45:30 UhrMen-de | Samstag, 15. Juni 2019 13:45:30 Uhr | เสาร์, 15 มิถุนายน 2562 01:45:30 PMnl-nl | Samstag, 15. Juni 2019 01:45:30 ne-np | Juni, 15. Mai 2019 01:45:30 Uhr fa-ir | April, 25. Januar 1398, 01:45:30 Uhr
Die wahrscheinlich offensichtlichste Beobachtung ist, dass das Ergebnis in der Sprache des angegebenen Gebietsschemas formatiert wird. Aber wenn wir genau hinsehen, können wir sehen, dass es auch den AM/PM-Bezeichner (tt
) für nl-nl
Kultur, wahrscheinlich weil diese Kultur normalerweise das 24-Stunden-Format verwendet. Wir können auch sehen, dass sogar unsere Positionierung in einigen Fällen ignoriert werden kann (z. B. fa-ir
).
Allerdings wird nicht alles ignoriert und so erhalten wir am Ende eine Kombination aus unseren expliziten Spezifikationen und denen, die durch das Gebietsschema bestimmt werden.
Finden/Ändern Ihrer aktuellen Sprache
Wie bereits erwähnt, wird die Sprache Ihrer aktuellen Sitzung verwendet, um das Gebietsschema zu bestimmen, wenn Sie das Argument „Kultur“ nicht angeben.
Es gibt mehrere Möglichkeiten, die Sprache Ihrer aktuellen Sitzung zu finden.
Sie können auch das Gebietsschema Ihrer aktuellen Verbindung ändern.
Alternativ können Sie auch einfach SET LANGUAGE
verwenden -Anweisung, um die aktuelle Sprache nach Bedarf umzuschalten.
Hier ist ein kurzes Beispiel mit SET LANGUAGE
um zu zeigen, dass Ihre eigenen Spracheinstellungen die Formatierungsergebnisse genauso beeinflussen können, wie wenn Sie das „Kultur“-Argument verwenden, wie in den vorherigen Beispielen.
DECLARE @num decimal(3,2) =-1.23;SET LANGUAGE British;SELECT FORMAT(@num, 'C') Ergebnis;SET LANGUAGE US_English;SELECT FORMAT(@num, 'C') Ergebnis;Ergebnisse:
+----------+| Ergebnis ||----------|| -£1.23 |+----------++----------+| Ergebnis ||----------|| ($1,23) |+----------+