Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Funktionsweise der FORMAT()-Funktion in SQL Server (T-SQL)

In SQL Server können Sie das T-SQL FORMAT() verwenden Funktion, um Werte wie Zahlen und Datumsangaben als formatierte Zeichenfolgen zurückzugeben.

Sie geben den zu formatierenden Wert an und geben das zu verwendende Format an. Die Funktion akzeptiert ein optionales Argument, mit dem Sie eine Kultur angeben können, die beim Formatieren des Werts verwendet werden soll.

Syntax

Die Syntax lautet wie folgt:

FORMAT ( value, format [, culture ] )

Wobei value ist der Wert, den Sie formatieren möchten, und format ist eine gültige Formatzeichenfolge, die das gewünschte Format angibt.

Die optionale culture Argument kann verwendet werden, um eine Kultur anzugeben. Wenn weggelassen, wird die Sprache der aktuellen Sitzung verwendet.

Das FORMAT Funktion ist nicht deterministisch.

Beispiel 1 – Formatiere eine Zahl

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 verwendet als Formatstring. Dies ist ein standardmäßiger numerischer Formatbezeichner für die Ausgabe des Werts als Zahl. Dieser spezielle Formatbezeichner führt dazu, dass die Ausgabe mit ganzzahligen und dezimalen Ziffern, Gruppentrennzeichen und einem Dezimaltrennzeichen mit optionalem negativen Vorzeichen formatiert wird. Bei diesem Formatbezeichner wird die Groß-/Kleinschreibung nicht beachtet, also entweder N oder n ist in Ordnung.

Beispiel 2 – Formatierung in eine Währung

Hier ist ein Beispiel für die Formatierung einer Zahl als Währung:

SELECT FORMAT(1, 'C') AS Result;

Ergebnis:

+----------+
| Result   |
|----------|
| $1.00    |
+----------+

Weitere Zahlenformate

Es gibt viele weitere Formatzeichenfolgen, die mit FORMAT() verwendet werden können Funktion. Beispielsweise gibt es Formatzeichenfolgen für Prozentsätze, Festkomma, Exponential (wissenschaftlich), Hexadezimal und mehr.

Die numerischen Formatzeichenfolgen sind in Standard und Benutzerdefiniert unterteilt.

Die folgenden beiden Artikel listen alle numerischen Formatzeichenfolgen auf, einschließlich Beispiele:

  • Standardzeichenfolgen für numerische Formate
  • Benutzerdefinierte numerische Formatzeichenfolgen

Weitere Beispiele zum Formatieren von Zahlen finden Sie auch unter So formatieren Sie Zahlen in SQL Server.

Beispiel 3 – Formatieren Sie ein Datum

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 die ein langes Datumsmuster angibt.

Weitere Datumsformate

Es gibt viele weitere Formatzeichenfolgen, die zum Formatieren von Datumsangaben verwendet werden können. Wie bei den numerischen Formatzeichenfolgen werden die Datums- und Zeitformatzeichenfolgen in Standard- und benutzerdefinierte Formate unterteilt, sodass Sie Ihre eigenen benutzerdefinierten Formate erstellen oder sich auf ein Standardformat verlassen können.

Die folgenden zwei Artikel listen alle Formatstrings für Datum und Uhrzeit auf, einschließlich Beispiele:

  • Standardformatzeichenfolgen für Datum und Uhrzeit
  • Benutzerdefinierte Formatzeichenfolgen für Datum und Uhrzeit

Weitere Beispiele finden Sie unter So formatieren Sie Datum und Uhrzeit in SQL Server.

Beispiel 4 – Die optionale culture Argument

Hier ist ein Beispiel für die Verwendung von culture Argument, 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      |
+----------+------------+---------+

Das FORMAT() Funktion akzeptiert jede Kultur, die von .NET Framework als Argument unterstützt wird; es ist nicht auf die explizit von SQL Server unterstützten Sprachen beschränkt.

Wenn Sie dieses Argument nicht angeben, wird die Sprache der aktuellen Sitzung verwendet.

Weitere Beispiele finden Sie unter Wie sich Spracheinstellungen auf Ihr FORMAT() auswirken können Ergebnisse.

Beispiel 5 – Ungültige culture Argument

Wenn Sie eine ungültige Kultur angeben, erhalten Sie eine Fehlermeldung:

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 gibt die Funktion jedoch NULL zurück . Folgendes passiert beispielsweise, wenn ich einen ungültigen zu formatierenden Wert angebe:

SELECT FORMAT(GETDATE(), 'C') AS 'Result';

Ergebnis:

+----------+
| Result   |
|----------|
| NULL     |
+----------+

In diesem Fall habe ich versucht, ein Datum in eine Währung zu formatieren, und daher war das Ergebnis NULL .

Gültige Datentypen

FORMAT() basiert auf dem Vorhandensein von .NET Framework Common Language Runtime (CLR) und verwendet die CLR-Formatierungsregeln.

Die folgenden Datentypen können mit dem FORMAT() formatiert werden Funktion. Diese Liste enthält die akzeptablen Datentypen für die Eingabezeichenfolge zusammen mit ihren .NET Framework-Zuordnungsäquivalenttypen.

Kategorie Typ .NET-Typ
Numerisch bigint Int64
Numerisch int Int32
Numerisch smallint Int16
Numerisch winzig Byte
Numerisch dezimal SqlDecimal
Numerisch numerisch SqlDecimal
Numerisch schwimmen Doppelt
Numerisch echt Single
Numerisch Kleingeld Dezimal
Numerisch Geld Dezimal
Datum und Uhrzeit Datum DatumUhrzeit
Datum und Uhrzeit Zeit Zeitspanne
Datum und Uhrzeit DatumUhrzeit DatumUhrzeit
Datum und Uhrzeit smalldatetime DatumUhrzeit
Datum und Uhrzeit datetime2 DatumUhrzeit
Datum und Uhrzeit datetimeoffset DateTimeOffset

Escapeing von Doppelpunkten und Punkten für den Datentyp „Zeit“

Bei Verwendung von FORMAT , Doppelpunkte und Punkte müssen maskiert werden (dies entspricht den CLR-Formatierungsregeln). Wenn daher die Formatzeichenfolge (zweiter Parameter) einen Doppelpunkt oder Punkt enthält, muss der Doppelpunkt oder Punkt mit einem umgekehrten Schrägstrich maskiert werden, wenn ein Eingabewert (erster Parameter) die Zeit ist Datentyp.

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     |
+--------------------+-------------+-----------+

Wie erwartet gibt die Zeichenfolge ohne Escapezeichen also NULL zurück .

Dies gilt wie erwähnt nur für die Zeit Datentyp. Wenn wir den Eingabewert in einen anderen Datentyp ändern, müssen wir ihn nicht maskieren:

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 ohne Escapezeichen in Ordnung.

Sie können den umgekehrten Schrägstrich auch verwenden, um jedes andere Zeichen zu maskieren, das Sie in die Ergebniszeichenfolge aufnehmen möchten, das andernfalls als Formatbezeichner interpretiert würde. Ein Backslash vor einem Zeichen bedeutet, dass das folgende Zeichen ein Zeichenliteral ist, das unverändert in die Ergebniszeichenfolge aufgenommen werden soll.

In einer benutzerdefinierten Datums- und Zeitformatzeichenfolge ist der d , f , F , g , h , H , K , m , M , s , t , y , z , : , oder / Zeichen werden als benutzerdefinierte Formatbezeichner und nicht als wörtliche Zeichen interpretiert.

In einer benutzerdefinierten numerischen Formatzeichenfolge ist der # , 0 , . , , , % , und Symbole werden als Formatbezeichner und nicht als wörtliche Zeichen interpretiert. Der Groß- und Kleinbuchstabe E sowie das + und - Symbole können auch als Formatbezeichner interpretiert werden, abhängig von ihrer Position innerhalb der Formatzeichenfolge.

Wenn Sie einen umgekehrten Schrägstrich in die Ergebniszeichenfolge einfügen müssen, maskieren Sie ihn mit einem weiteren umgekehrten Schrägstrich.

Remoting

Das FORMAT() Die Funktion kann nicht entfernt werden, da sie vom Vorhandensein der CLR abhängt. Das Remoting einer Funktion, die die CLR erfordert, könnte einen Fehler auf dem Remoteserver verursachen.

Wann sollte FORMAT() verwendet werden? Funktion

Microsoft empfiehlt, das FORMAT() -Funktion wird für die gebietsschemaabhängige Formatierung von Datums-/Uhrzeit- und Zahlenwerten als Zeichenfolgen verwendet, und für allgemeine Datentypkonvertierungen entweder die CAST() Funktion oder die CONVERT() Funktion sollte stattdessen verwendet werden.