Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como adicionar AM/PM a um valor de tempo no SQL Server (T-SQL)


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