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

Hinzufügen von AM/PM zu einem Zeitwert in SQL Server (T-SQL)

In SQL Server können Sie das T-SQL FORMAT() verwenden Funktion zum Formatieren einer Zeit Datentyp. Wenn Sie jedoch den AM/PM-Bezeichner hinzufügen müssen, müssen Sie einen anderen Datentyp verwenden. Das liegt an der Zeit Der Datentyp basiert speziell auf einer 24-Stunden-Uhr, und daher wird die Zeit als solche formatiert.

Beispiel 1 – Vergleich von „time“ mit „datetime“

Hier ist ein Beispiel, um zu demonstrieren, was passiert, wenn Sie versuchen, den Datentyp „Zeit“ mit dem AM/PM-Bezeichner zu formatieren:

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

Ergebnis:

+------------+--------+
| datetime   | time   |
|------------+--------|
| 11:28 AM   | NULL   |
+------------+--------+

Wenn Sie versuchen, den AM/PM-Bezeichner zu einem „Zeit“-Wert hinzuzufügen, erhalten Sie NULL .

Wenn Sie also AM oder PM zu einem Zeitdatentyp hinzufügen müssen, müssen Sie ihn zuerst in einen anderen Datentyp konvertieren und dann formatieren.

Beachten Sie, dass FORMAT() Die Funktion gibt das Ergebnis eigentlich sowieso als String zurück (es sei denn, das Ergebnis ist NULL ).

Falls Sie sich wundern, warum im zweiten Formatstring ein Backslash steht, dieser ist nur für die Zeit erforderlich Datentyp und wird verwendet, um den Doppelpunkt (und alle Punkte) zu maskieren. Mehr dazu hier.

Beispiel 2 – Konvertieren von „time“ in „datetime“

Dieses Beispiel ist fast identisch mit dem vorherigen Beispiel, außer dass ich versuche, es realistischer zu machen. In diesem setze ich explizit eine Variable als „Zeit“-Datentyp und versuche dann, das zu formatieren. Ich setze es dann als „datetime“ um, bevor ich es erneut formatiere.

DECLARE @thetime time = '11:28:15'
SELECT 
  FORMAT(@thetime, 'hh\:mm tt') 'time',
  FORMAT(CAST(@thetime AS datetime), 'hh:mm tt') 'datetime';

Ergebnis:

+--------+------------+
| time   | datetime   |
|--------+------------|
| NULL   | 11:28 AM   |
+--------+------------+

Wenn Sie es vorziehen, CONVERT() zu verwenden Funktion, so würde das aussehen:

DECLARE @thetime time = '11:28:15'
SELECT 
  FORMAT(@thetime, 'hh\:mm tt') 'time',
  FORMAT(CONVERT(datetime, @thetime), 'hh:mm tt') 'datetime';

Ergebnis:

+--------+------------+
| time   | datetime   |
|--------+------------|
| NULL   | 11:28 AM   |
+--------+------------+

Oder Sie können den Wert einfach einer anderen Variablen des gewünschten Typs zuweisen:

DECLARE @thetime time = '11:28:15'
DECLARE @thedatetime datetime = @thetime
SELECT 
  FORMAT(@thetime, 'hh\:mm tt') 'time',
  FORMAT(@thedatetime, 'hh:mm tt') 'datetime';

Ergebnis:

+--------+------------+
| time   | datetime   |
|--------+------------|
| NULL   | 11:28 AM   |
+--------+------------+

Beispiel 3 – Einzelbuchstabe AM/PM Kennung

Sie können auch ein einzelnes t verwenden um einen AM/PM-Bezeichner mit einem einzelnen Buchstaben anzugeben:

SELECT 
  FORMAT(CAST('11:28:15' AS datetime), 'hh:mm t') 'AM',
  FORMAT(CAST('23:28:15' AS datetime), 'hh:mm t') 'PM';

Ergebnis:

+---------+---------+
| AM      | PM      |
|---------+---------|
| 11:28 A | 11:28 P |
+---------+---------+

Beispiel 4 – Ohne Verwendung der FORMAT()-Funktion

Das FORMAT() Die Funktion wurde in SQL Server 2012 eingeführt. Wenn Sie eine frühere Version von SQL Server verwenden, müssen Sie eine andere Methode verwenden, um den AM/PM-Bezeichner hinzuzufügen. Hier ist eine Möglichkeit, das zu tun:

DECLARE @thetime time
SET @thetime = '11:28:15'
SELECT CONVERT(varchar(8), @thetime, 100) Result;

Ergebnis:

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

Alternativ können Sie 100 ersetzen mit 0 für das gleiche Ergebnis:

DECLARE @thetime time
SET @thetime = '11:28:15'
SELECT CONVERT(varchar(8), @thetime, 0) Result;

Ergebnis:

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