Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come aggiungere AM/PM a un valore temporale in SQL Server (T-SQL)

In SQL Server è possibile utilizzare T-SQL FORMAT() funzione per formattare un ora tipo di dati. Tuttavia, se devi aggiungere il designatore AM/PM, dovrai utilizzare un tipo di dati diverso. Questo perché il tempo il tipo di dati si basa specificamente su un orologio di 24 ore, quindi l'ora è formattata come tale.

Esempio 1:confronto tra "ora" e "data e ora"

Ecco un esempio per dimostrare cosa succede se provi a formattare il tipo di dati "ora" con il designatore 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';

Risultato:

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

Se provi ad aggiungere l'indicatore AM/PM a un valore "ora", otterrai NULL .

Pertanto, se devi aggiungere AM o PM a un tipo di dati dell'ora, dovrai prima convertirlo in un altro tipo di dati, quindi formattarlo.

Nota che il FORMAT() la funzione restituisce comunque il risultato come una stringa (a meno che il risultato non sia NULL ).

Se ti stai chiedendo perché c'è una barra rovesciata nella seconda stringa di formato, questa è richiesta solo per il tempo tipo di dati e viene utilizzato per eseguire l'escape dei due punti (e di eventuali punti). Maggiori informazioni qui.

Esempio 2:conversione di "ora" in "data e ora"

Questo esempio è quasi identico all'esempio precedente, tranne per il fatto che cerco di renderlo più realistico. In questo, ho impostato esplicitamente una variabile come tipo di dati "ora" e quindi ho provato a formattarlo. Quindi lo trascino come "datetime" prima di formattarlo di nuovo.

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

Risultato:

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

Se preferisci usare il CONVERT() funzione, ecco come sarebbe:

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

Risultato:

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

Oppure potresti semplicemente riassegnare il valore a un'altra variabile del tipo desiderato:

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

Risultato:

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

Esempio 3 – Lettera singola AM/PM Designatore

Puoi anche usare un singolo t per specificare una singola lettera designatore AM/PM:

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

Risultato:

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

Esempio 4 – Senza utilizzare la funzione FORMAT()

Il FORMAT() La funzione è stata introdotta in SQL Server 2012. Se usi una versione precedente di SQL Server, dovrai usare un metodo diverso per aggiungere il designatore AM/PM. Ecco un modo per farlo:

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

Risultato:

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

In alternativa, puoi utilizzare sostituisci 100 con 0 per lo stesso risultato:

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

Risultato:

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