Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment ajouter AM/PM à une valeur de temps dans SQL Server (T-SQL)

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