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

Denken Sie daran, wenn Sie einen TIME-Datentyp in SQL Server (T-SQL) formatieren

In SQL Server, wenn Sie das T-SQL FORMAT() verwenden Funktion zum Formatieren einer Zeit Datentyp müssen Sie daran denken, Doppelpunkte oder Punkte in Ihrer Formatzeichenfolge zu maskieren.

Das liegt daran, dass FORMAT() Die Funktion stützt sich auf CLR-Formatierungsregeln, die vorschreiben, dass Doppelpunkte und Punkte maskiert werden müssen. Wenn daher der Formatstring (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 1 – Escapezeichen für einen Doppelpunkt

Hier ist ein einfaches Beispiel für die Verwendung von FORMAT() Funktion zum Formatieren einer Zeit Datentyp.

SELECT FORMAT(CAST('11:28:15' AS time), 'hh\:mm') Result;

Ergebnis:

+----------+
| Result   |
|----------|
| 11:28    |
+----------+

Beachten Sie den umgekehrten Schrägstrich im Formatstring.

Beispiel 2 – Einem Punkt entkommen

Dasselbe gilt, wenn wir es mit einem Punkt formatieren wollen:

SELECT FORMAT(CAST('11:28:15' AS time), 'hh\.mm') Result;

Ergebnis:

+----------+
| Result   |
|----------|
| 11.28    |
+----------+

Beispiel 3 – Nicht maskiert

Folgendes passiert, wenn wir den Doppelpunkt oder Punkt nicht maskieren.

SELECT 
  FORMAT(CAST('11:28:15' AS time), 'hh:mm') 'Unescaped Colon',
  FORMAT(CAST('11:28:15' AS time), 'hh.mm') 'Unescaped Period';

Ergebnis:

+-------------------+--------------------+
| Unescaped Colon   | Unescaped Period   |
|-------------------+--------------------|
| NULL              | NULL               |
+-------------------+--------------------+

Wir erhalten NULL in beiden Fällen.

Beispiel 4 – Datetime (kein Escape erforderlich)

Sie müssen den Doppelpunkt und den Punkt nur maskieren, wenn der Eingabewert vom Datentyp time ist . Wenn es datetime ist (oder datetime2 usw.), müssen Sie ihnen nicht entkommen.

Wenn ich das vorherige Beispiel verwende, ändere aber die Eingabewerte auf datetime2 , erhalten wir das gewünschte Ergebnis, ohne irgendetwas maskieren zu müssen:

SELECT 
  FORMAT(CAST('11:28:15' AS datetime2), 'hh:mm') 'Unescaped Colon',
  FORMAT(CAST('11:28:15' AS datetime2), 'hh.mm') 'Unescaped Period';

Ergebnis:

+-------------------+--------------------+
| Unescaped Colon   | Unescaped Period   |
|-------------------+--------------------|
| 11:28             | 11.28              |
+-------------------+--------------------+

Dasselbe gilt für sysdatetime :

SELECT 
  FORMAT(SYSDATETIME(), 'hh:mm') 'Unescaped Colon',
  FORMAT(SYSDATETIME(), 'hh.mm') 'Unescaped Period';

Ergebnis:

+-------------------+--------------------+
| Unescaped Colon   | Unescaped Period   |
|-------------------+--------------------|
| 04:46             | 04.46              |
+-------------------+--------------------+