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

Lembre-se disso ao formatar um tipo de dados TIME no SQL Server (T-SQL)


No SQL Server, quando você usa o T-SQL FORMAT() função para formatar uma hora tipo de dados, você precisa se lembrar de escapar quaisquer dois pontos ou pontos em sua string de formato.

Isso ocorre porque o FORMAT() A função depende de regras de formatação CLR, que determinam que os dois pontos e os pontos devem ser escapados. Portanto, quando a string de formato (segundo parâmetro) contém dois pontos ou ponto, os dois pontos ou ponto devem ser escapados com barra invertida quando um valor de entrada (primeiro parâmetro) é do tempo tipo de dados.


Exemplo 1 – Fuga de dois pontos


Veja um exemplo básico de como usar o FORMAT() função para formatar uma hora tipo de dados.
SELECT FORMAT(CAST('11:28:15' AS time), 'hh\:mm') Result;

Resultado:
+----------+
| Result   |
|----------|
| 11:28    |
+----------+

Observe a barra invertida na string de formato.

Exemplo 2 – Fuga de um período


A mesma coisa se aplica se quisermos formatá-lo com um ponto:
SELECT FORMAT(CAST('11:28:15' AS time), 'hh\.mm') Result;

Resultado:
+----------+
| Result   |
|----------|
| 11.28    |
+----------+

Exemplo 3 – Sem escape


Aqui está o que acontece se não escaparmos dos dois pontos ou ponto final.
SELECT 
  FORMAT(CAST('11:28:15' AS time), 'hh:mm') 'Unescaped Colon',
  FORMAT(CAST('11:28:15' AS time), 'hh.mm') 'Unescaped Period';

Resultado:
+-------------------+--------------------+
| Unescaped Colon   | Unescaped Period   |
|-------------------+--------------------|
| NULL              | NULL               |
+-------------------+--------------------+

Obtemos NULL em ambos os casos.

Exemplo 4 – Data e hora (sem necessidade de escape)


Você só precisa escapar dos dois pontos e do ponto final se o valor de entrada for do tipo de dados hora . Se for datahora (ou datetime2 etc), você não precisa escapar deles.

Se eu usar o exemplo anterior, mas mudar os valores de entrada para datetime2 , obtemos o resultado desejado sem precisar escapar de nada:
SELECT 
  FORMAT(CAST('11:28:15' AS datetime2), 'hh:mm') 'Unescaped Colon',
  FORMAT(CAST('11:28:15' AS datetime2), 'hh.mm') 'Unescaped Period';

Resultado:
+-------------------+--------------------+
| Unescaped Colon   | Unescaped Period   |
|-------------------+--------------------|
| 11:28             | 11.28              |
+-------------------+--------------------+

O mesmo se aplica a sysdatetime :
SELECT 
  FORMAT(SYSDATETIME(), 'hh:mm') 'Unescaped Colon',
  FORMAT(SYSDATETIME(), 'hh.mm') 'Unescaped Period';

Resultado:
+-------------------+--------------------+
| Unescaped Colon   | Unescaped Period   |
|-------------------+--------------------|
| 04:46             | 04.46              |
+-------------------+--------------------+