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

Várias maneiras de usar a função de data SQL CONVERT




Neste artigo, exploraremos os diferentes formatos de data do SQL CONVERT no SQL Server.

A interpretação da data varia entre os diferentes países. Suponha que você tenha um banco de dados global do SQL Server com uma tabela que contém um formato de data específico. Por exemplo, tem uma coluna de data que tem o valor 01/05/2020.

Como você interpreta isso? Vejamos as seguintes interpretações em diferentes países.
  • EUA:5 de janeiro de 2020 (formato padrão – mm/dd/aaaa)
  • Europa:1º de maio de 2020 (formato padrão – dd/mm/aaaa)

Além disso, outros países seguem formatos de data diferentes:
  • Turquia:dd.mm.aaaa
  • Índia:dd-mm-aaaa
  • Bulgária:aaaa-m-d
  • Hungria:aaaa.mm.dd.

Você pode consultar a Wikipédia para obter mais informações sobre os formatos de data por país.

Além disso, às vezes também queremos incluir o carimbo de data/hora junto com as datas. Alguns exemplos disso são:
  • 01/05/2020 10h
  • 05/05/2020 14:00
  • 05/05/2020 14h
  • 01/05/2020 02:00:55

Não é possível armazenar datas em uma tabela do SQL Server em formatos diferentes, portanto, precisamos de uma maneira de converter formatos de data. Vamos explorar os diferentes métodos de formato de data SQL CONVERT.

Função de data SQL CONVERT


Normalmente, os profissionais de banco de dados usam a função de data SQL CONVERT para obter datas em um formato especificado e consistente. Isso aplica os códigos de estilo para datas de saída específicas.

Sintaxe da função CONVERT():

CONVERT(tipo de dados, data/hora [,estilo])

Na consulta SQL abaixo, convertemos a data e hora em dois formatos usando a função CONVERT().
  • formato mm/dd/aa:código de estilo 1
  • formato mm/dd/aaaa:código de estilo 101
DECLARE @Inputdate datetime = '2019-12-31 14:43:35.863';
Select CONVERT(varchar,@Inputdate,1) as [mm/dd/yy],
CONVERT(varchar,@Inputdate,101) as [mm/dd/yyyy]



Da mesma forma, podemos especificar códigos de estilo diferentes para que você possa converter as datas no formato desejado.
SELECT '0' AS [StyleCode],
'Default format' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 0) AS [OutputFormat]
UNION ALL
SELECT '1' AS [StyleCode],
'USA - mm/dd/yy' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 1) AS [OutputFormat]
UNION ALL
SELECT '2' AS [StyleCode],
'ANSI - dd.mm.yy' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 2) AS [OutputFormat]
UNION ALL
SELECT '3' AS [StyleCode],
'British and French - dd/mm/yy' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 3) AS [OutputFormat]
UNION ALL
SELECT '4' AS [StyleCode],
'German - dd.mm.yy' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 4) AS [OutputFormat]
UNION ALL
SELECT '5' AS [StyleCode],
'Italian - dd-mm-yy ' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 5) AS [OutputFormat]
UNION ALL
SELECT '6' AS [StyleCode],
'Shortened month name -dd mon yy' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 6) AS [OutputFormat]
UNION ALL
SELECT '7' AS [StyleCode],
'Shortened month name - mon dd, yy' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 7) AS [OutputFormat]
UNION ALL
SELECT '8' AS [StyleCode],
'24 hour time -hh:mm:ss' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 8) AS [OutputFormat]
UNION ALL
SELECT '9' AS [StyleCode],
'Default + milliseconds - mon dd yyyy hh:mm:ss:mmmAM (or PM)' AS
[Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 9) AS [OutputFormat]
UNION ALL
SELECT '10' AS [StyleCode],
'USA - mm-dd-yy' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 10) AS [OutputFormat]
UNION ALL
SELECT '11' AS [StyleCode],
'Japan -yy/mm/dd' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 11) AS [OutputFormat]
UNION ALL
SELECT '12' AS [StyleCode],
'ISO format -yymmdd' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 12) AS [OutputFormat]
UNION ALL
SELECT '13' AS [StyleCode],
'Europe default + milliseconds -dd mon yyyy hh:mm:ss:mmm' AS
[Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 13) AS [OutputFormat]
UNION ALL
SELECT '14' AS [StyleCode],
' 24 hour time with milliseconds -hh:mm:ss:mmm(24h)' AS
[Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 14) AS [OutputFormat]
UNION ALL
SELECT '20' AS [StyleCode],
'ODBC canonical -yyyy-mm-dd hh:mm:ss(24h)' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 20) AS [OutputFormat]
UNION ALL
SELECT '21' AS [StyleCode],
'ODBC canonical (with milliseconds) -yyyy-mm-dd hh:mm:ss.mmm' AS
[Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 21) AS [OutputFormat]
UNION ALL
SELECT '22' AS [StyleCode],
'mm/dd/yy hh:mm:ss AM (or PM)' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 22) AS [OutputFormat]
UNION ALL
SELECT '23' AS [StyleCode],
'ISO 8601 - yyyy-mm-dd' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 23) AS [OutputFormat]
UNION ALL
SELECT '100' AS [StyleCode],
'mon dd yyyy hh:mmAM' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 100) AS [OutputFormat]
UNION ALL
SELECT '101' AS [StyleCode],
'USA -mm/dd/yyyy' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 101) AS [OutputFormat]
UNION ALL
SELECT '102' AS [StyleCode],
'ANSI -yyyy.mm.dd' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 102) AS [OutputFormat]
UNION ALL
SELECT '103' AS [StyleCode],
'British/French -dd/mm/yyyy' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 103) AS [OutputFormat]
UNION ALL
SELECT '104' AS [StyleCode],
'German - dd.mm.yyyy' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 104) AS [OutputFormat]
UNION ALL
SELECT '105' AS [StyleCode],
'Italian -dd-mm-yyyy' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 105) AS [OutputFormat]
UNION ALL
SELECT '106' AS [StyleCode],
'Shortened month name -dd mon yyyy' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 106) AS [OutputFormat]
UNION ALL
SELECT '107' AS [StyleCode],
'Shortened month name -mon dd, yyyy' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 107) AS [OutputFormat]
UNION ALL
SELECT '108' AS [StyleCode],
'24 hour time -hh:mm:ss' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 108) AS [OutputFormat]
UNION ALL
SELECT '109' AS
[StyleCode],
'Default + milliseconds -mon dd yyyy hh:mm:ss:mmmAM (or PM) ' AS
[Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 109) AS [OutputFormat]
UNION ALL
SELECT '110' AS [StyleCode],
'USA -mm-dd-yyyy' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 110) AS [OutputFormat]
UNION ALL
SELECT '111' AS [StyleCode],
'JAPAN -yyyy/mm/dd' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 111) AS [OutputFormat]
UNION ALL
SELECT '112' AS [StyleCode],
'ISO -yyyymmdd' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 112) AS [OutputFormat]
UNION ALL
SELECT '113' AS [StyleCode],
'Europe default + milliseconds -dd mon yyyy hh:mm:ss:mmm' AS
[Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 113) AS [OutputFormat]
UNION ALL
SELECT '114' AS [StyleCode],
' 24 hour time with milliseconds -hh:mm:ss:mmm(24h)' AS
[Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 114) AS [OutputFormat]
UNION ALL
SELECT '120' AS [StyleCode],
'ODBC canonical- yyyy-mm-dd hh:mm:ss(24h)' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 120) AS [OutputFormat]
UNION ALL
SELECT '121' AS [StyleCode],
'ODBC canonical (with milliseconds) -yyyy-mm-dd hh:mm:ss.mmm' AS
[Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 121) AS [OutputFormat]
UNION ALL
SELECT '126' AS [StyleCode],
'ISO8601 -yyyy-mm-ddThh:mm:ss.mmm' AS [Standard and Format],
CONVERT(VARCHAR(50), Getdate(), 126) AS [OutputFormat]
UNION ALL
SELECT '127' AS [StyleCode],
'ISO8601 with time zone Z-yyyy-mm-ddThh:mm:ss.mmmZ' AS
[Standard and Format],
CONVERT(VARCHAR(100), Getdate(), 127) AS [OutputFormat]
UNION ALL
SELECT '131' AS [StyleCode],
'Arabic Hijri date - Islamic calendar' AS [Standard and Format],
CONVERT(VARCHAR(100), Getdate(), 131) AS [OutputFormat]

Na captura de tela abaixo, você pode ver o código do estilo, seus padrões, formatos e datas de saída.


Conversão de datas usando a função FORMAT()


Na função CONVERT() acima, somos obrigados a especificar códigos de estilo para uma saída de formato específico. Normalmente, não queremos ter que lembrar desses códigos; portanto, a Microsoft introduziu a função FORMAT() no SQL Server 2012.

A sintaxe é mostrada abaixo.

FORMAT (valor, formato [, cultura])

Valor :Requer um valor no formato suportado. Você pode consultar a documentação da Microsoft para obter uma lista detalhada.

Formato :No formato, podemos especificar os códigos de formato ou padrão para converter os dados de data de entrada. O script abaixo mostra os códigos de formato, padrão e formato de saída.
DECLARE @InputDate DATETIME = '2020-12-08 15:58:17.643'
SELECT 'd' AS [FormatCode],
'Short Date Pattern' AS 'Pattern',
Format(@InputDate, 'd') AS 'Output'
UNION ALL
SELECT 'D' AS [FormatCode],
'Long Date Pattern' AS 'Pattern',
Format(@InputDate, 'D') AS 'Output'
UNION ALL
SELECT 'f' AS [FormatCode],
'Full Date/Time pattern (Short Time)' AS 'Pattern',
Format(@InputDate, 'f') AS 'Output'
UNION ALL
SELECT 'F' AS [FormatCode],
'Full Date/Time pattern (Long Time)' AS 'Pattern',
Format(@InputDate, 'F')
UNION ALL
SELECT 'g' AS [FormatCode],
'General Date/Time pattern (Short Time)' AS 'Pattern',
Format(@InputDate, 'g')
UNION ALL
SELECT 'G' AS [FormatCode],
'General Date/Time pattern (Long Time)' AS 'Pattern',
Format(@InputDate, 'G') AS 'Output'
UNION ALL
SELECT 'm' AS [FormatCode],
'Month/Day pattern' AS 'Pattern',
Format(@InputDate, 'm') AS 'Output'
UNION ALL
SELECT 'O' AS [FormatCode],
'Round trip Date/Time pattern' AS 'Pattern',
Format(@InputDate, 'O') AS 'Output'
UNION ALL
SELECT 'R' AS [FormatCode],
'RFC1123 pattern' AS 'Pattern',
Format(@InputDate, 'R') AS 'Output'
UNION ALL
SELECT 's' AS [FormatCode],
'Sortable Date/Time pattern' AS 'Pattern',
Format(@InputDate, 's') AS 'Output'
UNION ALL
SELECT 't' AS [FormatCode],
'Short Time pattern' AS 'Pattern',
Format(@InputDate, 't') AS 'Output'
UNION ALL
SELECT 'T' AS [FormatCode],
'Long Time Pattern' AS 'Pattern',
Format(@InputDate, 'T') AS 'Output'
UNION ALL
SELECT 'u' AS [FormatCode],
'Universal sortable Date/Time pattern' AS 'Pattern',
Format(@InputDate, 'u') AS 'Output'
UNION ALL
SELECT 'U' AS [FormatCode],
'Universal Full Date/Time pattern' AS 'Pattern',
Format(@InputDate, 'U') AS 'Output'
UNION ALL
SELECT 'Y' AS [FormatCode],
'Year Month pattern' AS 'Pattern',
Format(@InputDate, 'Y') AS 'Output'



Cultura :é um argumento opcional e define a cultura. Se não especificarmos nenhuma cultura, o SQL Server usará o idioma da sessão atual.

Na consulta abaixo, converteremos um formato de data em uma cultura especificada. Precisamos especificar o código de cultura. Por exemplo, o código de cultura para os EUA é en-US e hi-IN é para a Índia.

Os scripts usam o d código de formato para padrões de datas curtas.
DECLARE @d DATETIME ='2020-12-08 16:36:17.760';
SELECT FORMAT (@d, 'd', 'en-US') AS 'US English',
FORMAT (@d, 'd', 'no') AS 'Norwegian Result',
FORMAT(@d, 'd', 'hi-IN') AS 'India',
FORMAT(@d, 'd', 'ru-RU') AS 'Russian',
FORMAT(@d, 'd', 'gl-ES') AS 'Galician (Spain)',
FORMAT ( @d, 'd', 'en-gb' ) AS 'Great Britain English',
FORMAT (@d, 'd', 'zu') AS 'Zulu',
FORMAT ( @d, 'd', 'de-de' ) AS 'German',
FORMAT ( @d, 'd', 'zh-cn' ) AS 'Simplified Chinese (PRC)';

Você obtém o formato de data em uma cultura especificada, conforme mostrado abaixo.



Se você quiser a saída de data no padrão completo de data/hora (longo tempo), especifique o código de formato F e ele altera rapidamente o formato de data.



No formato de data, você também pode especificar os formatos personalizados e converte a string de data de entrada de acordo com seus requisitos.

Para especificar as strings personalizadas, podemos usar as seguintes abreviações.
  • dd:dia do mês (01 a 31)
  • dddd:ortografia do dia
  • MM:número do mês (01 a 12)
  • MMMM:ortografia do mês
  • aa:ano com dois dígitos
  • aaaa:ano de quatro dígitos
  • hh:é de 01 a 12
  • HH:Dá 24 horas. formato hora 00 a 23
  • mm:minuto 00 a 59
  • ss:segundo de 00 a 59
  • tt:AM ou PM

No script abaixo, convertemos os formatos de data de entrada em vários formatos usando as abreviações ou códigos acima.
DECLARE @d DATETIME ='2020-12-08 16:36:17.760';
SELECT
FORMAT (@d,'dd/MM/yyyy ') as [Date Format 1] ,
FORMAT (@d, 'dd/MM/yyyy, hh:mm:ss ') as [Date Format 2] ,
FORMAT(@d,'yyyy-MM-dd HH:mm:ss')as [Date Format 3] ,
FORMAT(@d,'Dd MMM yyyy HH:mm:ss')as [Date Format 4] ,
FORMAT(@d,'MMM d yyyy h:mm:ss')as [Date Format 5] ,
FORMAT (@d, 'dddd, MMMM, yyyy')as [Date Format 6] ,
FORMAT (@d, 'MMM dd yyyy') as [Date Format 7] ,
FORMAT (@d, 'MM.dd.yy') as [Date Format 8] ,
FORMAT (@d, 'MM-dd-yy') as [Date Format 9] ,
FORMAT (@d, 'hh:mm:ss tt')as [Date Format 10] ,
FORMAT (@d, 'd-M-yy')as [Date Format 11] ,
FORMAT(@d,'MMMM dd,yyyy')as [Date Format 12]


Usando AT TIME ZONE no SQL Server 2016 ou posterior


Diferentes países seguem diferentes fusos horários. Normalmente, esses fusos horários seguem o deslocamento do horário do Tempo Universal Coordenado (UTC). Alguns exemplos de fusos horários são:
  • Horário de verão central australiano:UTC +10:30
  • Horário padrão da Índia:UTC +5:30
  • Horário de verão da montanha:UTC-6
  • Horário de Cingapura:UTC+8
  • Horário de verão central:UTC-5

Você pode consultar este artigo para obter uma lista detalhada de fusos horários.

Muitos países seguem o horário de verão e o relógio é ajustado em 1 hora (ou 30-45 minutos), dependendo dos fusos horários. Por exemplo, o horário de verão central seguiu a programação abaixo:
  • O horário padrão começou:1º de novembro de 2020, 02:00, horário local. Os relógios foram atrasados ​​em uma hora.
  • O horário padrão termina em 14 de março de 2021 às 02:00, horário local. Os relógios avançarão uma hora.

SQL Server não está ciente desses fusos horários e horário de verão. Normalmente, uma organização segue as zonas UTC, pois não requer nenhuma alteração.

Como podemos converter fusos horários no SQL Server?


Você pode usar AT TIME ZONE a partir do SQL Server 2016 e converter os fusos horários. Na consulta abaixo, ele mostra as datas do Horário Padrão Central, Horário Padrão da Índia e Horário Padrão de Samoa.
Declare @DateinUTC datetime2='2020-11-01 02:00:00'
select
@DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'Central Standard Time' as 'Central Standard Time' ,
@DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'India Standard Time' as 'India Standard Time',
@DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'Samoa Standard Time' as 'Samoa Standard Time',
@DateinUTC AT TIME ZONE 'UTC' AT TIME ZONE 'Dateline Standard Time' as 'Dateline Standard Time'



Para saber os fusos horários compatíveis, você pode consultar sys.time_zone_info  e retorna o fuso horário e o deslocamento.



Você pode filtrar os fusos horários que estão atualmente cumprindo o horário de verão.
Select * from sys.time_zone_info where is_currently_dst=1



Agora, vamos considerar o horário de verão para o horário do leste.
  • O horário de verão começou – domingo, 8 de março de 2020 às 2h.
  • O horário de verão terminou:domingo, 1º de novembro de 2020, às 2h.

Converta sua zona UTC para o Horário Padrão do Leste e você poderá observar o impacto do horário de verão.
DECLARE
@PreDST datetime = '2020-03-08 06:59:00',
@PostDST datetime = '2020-03-08 07:00:00';
SELECT
@PreDST AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time' AS [EST time before DST],
@PostDST AT TIME ZONE 'UTC' AT TIME ZONE 'Eastern Standard Time' AS [EST time before DST];


Pontos úteis para usar formatos de data SQL CONVERT


Avalie os requisitos do seu aplicativo e escolha o tipo de dados apropriado, SmallDateTime, DateTime, DateTime2 e DateTimeOffset.

Você pode converter o formato de data usando as funções SQL CONVERT date e FORMAT; no entanto, é aconselhável usar o formato que melhor satisfaça suas cargas de trabalho. Isso ajudará você a evitar ter que usar a conversão de data explícita.

Você pode contabilizar o horário de verão no SQL Server usando a função AT TIME ZONE a partir do SQL