No SQL Server, você pode usar o T-SQL
FORMAT()
função para formatar uma hora tipo de dados. No entanto, se você precisar adicionar o designador AM/PM, precisará usar um tipo de dados diferente. Isso ocorre porque o tempo tipo de dados é baseado especificamente em um relógio de 24 horas e, portanto, a hora é formatada como tal. Exemplo 1 – Comparando 'hora' com 'datahora'
Aqui está um exemplo para demonstrar o que acontece se você tentar formatar o tipo de dados 'time' com o designador 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';
Resultado:
+------------+--------+ | datetime | time | |------------+--------| | 11:28 AM | NULL | +------------+--------+
Se você tentar adicionar o designador AM/PM a um valor 'time', você obterá
NULL
. Portanto, se você precisar adicionar AM ou PM a um tipo de dados de hora, precisará convertê-lo em outro tipo de dados primeiro e depois formatá-lo.
Observe que o
FORMAT()
a função retorna o resultado como uma string de qualquer maneira (a menos que o resultado seja NULL
). Se você está se perguntando por que há uma barra invertida na segunda string de formato, isso é necessário apenas para o tempo tipo de dados e é usado para escapar dos dois pontos (e quaisquer pontos). Mais sobre isso aqui.
Exemplo 2 – Convertendo 'hora' para 'datahora'
Este exemplo é quase idêntico ao exemplo anterior, exceto que tento torná-lo mais realista. Neste, defino explicitamente uma variável como um tipo de dados 'tempo' e tento formatá-la. Em seguida, lancei-o como 'datetime' antes de formatá-lo novamente.
DECLARE @thetime time = '11:28:15' SELECT FORMAT(@thetime, 'hh\:mm tt') 'time', FORMAT(CAST(@thetime AS datetime), 'hh:mm tt') 'datetime';
Resultado:
+--------+------------+ | time | datetime | |--------+------------| | NULL | 11:28 AM | +--------+------------+
Se você preferir usar o
CONVERT()
função, eis como seria:DECLARE @thetime time = '11:28:15' SELECT FORMAT(@thetime, 'hh\:mm tt') 'time', FORMAT(CONVERT(datetime, @thetime), 'hh:mm tt') 'datetime';
Resultado:
+--------+------------+ | time | datetime | |--------+------------| | NULL | 11:28 AM | +--------+------------+
Ou você pode simplesmente reatribuir o valor a outra variável do tipo desejado:
DECLARE @thetime time = '11:28:15' DECLARE @thedatetime datetime = @thetime SELECT FORMAT(@thetime, 'hh\:mm tt') 'time', FORMAT(@thedatetime, 'hh:mm tt') 'datetime';
Resultado:
+--------+------------+ | time | datetime | |--------+------------| | NULL | 11:28 AM | +--------+------------+
Exemplo 3 - Designador de uma letra AM/PM
Você também pode usar um único
t
para especificar um designador de uma única letra 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';
Resultado:
+---------+---------+ | AM | PM | |---------+---------| | 11:28 A | 11:28 P | +---------+---------+
Exemplo 4 – Sem usar a função FORMAT()
O
FORMAT()
A função foi introduzida no SQL Server 2012. Se você usar uma versão anterior do SQL Server, precisará usar um método diferente para adicionar o designador AM/PM. Aqui está uma maneira de você fazer isso:DECLARE @thetime time SET @thetime = '11:28:15' SELECT CONVERT(varchar(8), @thetime, 100) Result;
Resultado:
+----------+ | Result | |----------| | 11:28AM | +----------+
Como alternativa, você pode usar substituir
100
com 0
para o mesmo resultado:DECLARE @thetime time SET @thetime = '11:28:15' SELECT CONVERT(varchar(8), @thetime, 0) Result;
Resultado:
+----------+ | Result | |----------| | 11:28AM | +----------+