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