Dans SQL Server, vous pouvez utiliser le T-SQL FORMAT()
fonction pour formater une heure Type de données. Cependant, si vous devez ajouter l'indicateur AM/PM, vous devrez utiliser un type de données différent. C'est parce que le temps Le type de données est spécifiquement basé sur une horloge de 24 heures et, par conséquent, l'heure est formatée en tant que telle.
Exemple 1 – Comparaison de « heure » avec « datetime »
Voici un exemple pour illustrer ce qui se passe si vous essayez de formater le type de données "heure" avec l'indicateur AM/PM :
SELECT FORMAT(CAST('11:28:15' AS datetime), 'hh:mm tt') 'datetime', FORMAT(CAST('11:28:15' AS time), 'hh\:mm tt') 'time';
Résultat :
+------------+--------+ | datetime | time | |------------+--------| | 11:28 AM | NULL | +------------+--------+
Si vous essayez d'ajouter l'indicateur AM/PM à une valeur "heure", vous obtiendrez NULL
.
Par conséquent, si vous devez ajouter AM ou PM à un type de données de temps, vous devrez d'abord le convertir en un autre type de données, puis le formater.
Notez que le FORMAT()
la fonction renvoie en fait le résultat sous forme de chaîne de toute façon (sauf si le résultat est NULL
).
Si vous vous demandez pourquoi il y a une barre oblique inverse dans la deuxième chaîne de format, cela n'est requis que pour le time type de données, et il est utilisé pour échapper les deux-points (et tous les points). Plus d'informations ici.
Exemple 2 – Conversion de "heure" en "dateheure"
Cet exemple est presque identique à l'exemple précédent, sauf que j'essaie de le rendre plus réaliste. Dans celui-ci, je définis explicitement une variable en tant que type de données "heure", puis j'essaie de la formater. Je l'ai ensuite converti en "datetime" avant de le formater à nouveau.
DECLARE @thetime time = '11:28:15' SELECT FORMAT(@thetime, 'hh\:mm tt') 'time', FORMAT(CAST(@thetime AS datetime), 'hh:mm tt') 'datetime';
Résultat :
+--------+------------+ | time | datetime | |--------+------------| | NULL | 11:28 AM | +--------+------------+
Si vous préférez utiliser le CONVERT()
fonction, voici à quoi cela ressemblerait :
DECLARE @thetime time = '11:28:15' SELECT FORMAT(@thetime, 'hh\:mm tt') 'time', FORMAT(CONVERT(datetime, @thetime), 'hh:mm tt') 'datetime';
Résultat :
+--------+------------+ | time | datetime | |--------+------------| | NULL | 11:28 AM | +--------+------------+
Ou vous pouvez simplement réaffecter la valeur à une autre variable du type souhaité :
DECLARE @thetime time = '11:28:15' DECLARE @thedatetime datetime = @thetime SELECT FORMAT(@thetime, 'hh\:mm tt') 'time', FORMAT(@thedatetime, 'hh:mm tt') 'datetime';
Résultat :
+--------+------------+ | time | datetime | |--------+------------| | NULL | 11:28 AM | +--------+------------+
Exemple 3 – Indicateur AM/PM à lettre unique
Vous pouvez également utiliser un seul t
pour spécifier un indicatif AM/PM à une seule lettre :
SELECT FORMAT(CAST('11:28:15' AS datetime), 'hh:mm t') 'AM', FORMAT(CAST('23:28:15' AS datetime), 'hh:mm t') 'PM';
Résultat :
+---------+---------+ | AM | PM | |---------+---------| | 11:28 A | 11:28 P | +---------+---------+
Exemple 4 – Sans utiliser la fonction FORMAT()
Le FORMAT()
a été introduite dans SQL Server 2012. Si vous utilisez une version antérieure de SQL Server, vous devrez utiliser une méthode différente pour ajouter l'indicateur AM/PM. Voici une façon de procéder :
DECLARE @thetime time SET @thetime = '11:28:15' SELECT CONVERT(varchar(8), @thetime, 100) Result;
Résultat :
+----------+ | Result | |----------| | 11:28AM | +----------+
Alternativement, vous pouvez utiliser remplacer 100
avec 0
pour le même résultat :
DECLARE @thetime time SET @thetime = '11:28:15' SELECT CONVERT(varchar(8), @thetime, 0) Result;
Résultat :
+----------+ | Result | |----------| | 11:28AM | +----------+