Introdução
Tipos de dados são atributos que especificam o tipo de dados que objetos como colunas, variáveis locais, expressões e parâmetros podem conter. Em todo o mundo RDBMS, os tipos de dados são normalmente agrupados em tipos de dados de string, numéricos e de data.
O T-SQL suporta 6 tipos de dados de data e hora, a saber:
- Data e hora
- Smalldatetime
- Data
- Hora
- Datahora2
- Deslocamento de data e hora
Os dois primeiros tipos de dados são considerados versões legadas dos mais recentes. Neste artigo, nos concentramos nos tipos de dados de data e, especificamente, no datetime e datetime2 tipos de dados disponíveis no SQL Server. A Tabela 1 fornece detalhes dos vários tipos de dados de data e hora disponíveis no SQL Server.
[ID da tabela=59 /]
Guia 1 Tipos de dados de data e hora
Datahora e Datahora2
Datatime é um tipo de dados que combina data com hora em um formato de relógio de 24 horas. O intervalo de datas suportado no tipo de dados datetime é mostrado na guia 1 e tem uma precisão de cerca de 3 milissegundos.
Datetime2 é uma extensão do tipo de dados datetime. Ele acomoda uma faixa mais ampla de valores possíveis e possui uma precisão de 100 nanossegundos, muito melhor que seu antecessor. Outro aspecto importante do tipo de dados dattime2 é que o armazenamento necessário varia de 6 a 8 bytes, dependendo da precisão escolhida.
- Você pode obter uma precisão de 1 milissegundo permitindo três casas decimais no componente segundos. Cada valor consumirá seis bytes.
- Você pode obter uma precisão de 100 nanossegundos permitindo sete casas decimais no componente de segundos. Cada valor consumirá oito bytes.
Demonstrações
Inserir valores de data incorretos
Criamos uma tabela com os detalhes mostrados na Listagem 1 para realizar algumas demonstrações que ilustram como manipular o datetime e datetime2 tipos de dados.
-- Listing 1 Create Table and insert Rows -- Create Table with Data Types use Practice2017 go create table staffers ( fname varchar(50), lname varchar(50), JobTitle varchar(100), DOB datetime, PreciseDOB datetime2, LastLoginTime time) go
Em seguida, tentamos preencher a tabela com uma linha conforme mostrado na Listagem 2, mas obtemos o erro mostrado na Fig. 1. A palavra-chave na mensagem de erro é valores “fora do intervalo”. O que está dizendo é que o valor dela que estamos tentando inserir é menor que 01-Jan-1753 ou superior a 31-dez-9999 . Nesse caso, o problema é que não usamos o formato de entrada recomendado de ‘AAAAMMDD hh:mm:ss.nnn ’ (ver Tabela 1). Lendo o valor '06101979 ‘, o SQL Server assume que 0610 é o ano (correspondente a YYYY). Este erro não é gerado para o tipo de dados datetime2 porque o intervalo para datetime2 é mais amplo a partir do ano 0001.
-- Listing 2 Insert Rows with Wrong Entry Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'06101979' ,'06101979' ,'8:00 AM' )
Fig. 1 Erro retornado para a coluna de data e hora
Inserir valores de data corretos
Tentamos corrigir o problema inserindo o formato de entrada correto para a coluna datetime conforme mostrado na Listagem 3. Quando executamos a instrução novamente, obtemos o erro mostrado na Fig. 2. Esse erro é causado essencialmente pela mesma falha em seguir as especificações do formato de entrada. No entanto, o problema está na outra parte da data '06101979 ‘ que corresponde ao formato de entrada ‘AAAAMMDD hh:mm:ss.nnn '. Nesse caso, o SQL Server assumiu 19 É um mês e 79 é um dia do mês. A tentativa dessa conversão implícita falha, pois nenhuma das asserções anteriores é verdadeira.
-- Listing 3 Insert Rows with One Correct Entry Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'19791006' ,'01061979' ,'8:00 AM' )
Fig. 2 Erro retornado para a coluna Datetime2
A Listagem 4 nos permite demonstrar a última afirmação. O valor 01101201 se encaixa no intervalo para datetime2 e podemos inserir a linha. Este valor se traduz em 1º de dezembro de 0110, como vemos na fig. 3.
-- Listing 4: Insert Rows with Correct Date Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'19791006' ,'01101201' ,'8:00 AM')
-- Listing 5: Insert Rows with All Correct Entry Format insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'19791006' ,'19791006' ,'8:00 AM' )
Verificando os dados
Fig. 3 Consultando o conjunto de dados
Quando consultamos a tabela staffers vemos claramente a precisão do tipo de dados datetime quando comparado com a alternativa datetime2. Vamos passar para algo um pouco mais sinistro:configurações de idioma. Dê uma olhada na Listagem 6. Estamos inserindo exatamente os mesmos registros usando o formato de data 06/10/1979 . Este formato NÃO é neutro em termos de idioma, portanto, quando definimos o idioma como britânico na primeira instrução e depois para us_english no segundo, descobrimos que inserimos duas datas diferentes, embora nossos valores brutos sejam os mesmos. É por isso que é tão importante sempre usar o formato de entrada recomendado ao lidar com datetime e datetime2 .
-- Listing 6: Impact of Language Settings set language british insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'06/10/1979' ,'06/10/1979' ,'8:00 AM' ) set language us_english insert into staffers values ( 'Kenneth' ,'Igiri' ,'Database Administrator' ,'06/10/1979' ,'06/10/1979' ,'8:00 AM' )
Fig. 4 Consultando Funcionários
Com a configuração de idioma como britânico , o SQL Server interpreta os dois primeiros números como o dia, mas com a configuração de idioma como us_english , o SQL Server interpreta os dois primeiros números como um mês. Uma última coisa que precisamos mencionar aqui é que, ao inserir nossos registros, não especificamos o componente de hora, portanto, o SQL Server assume automaticamente que era meia-noite média da data especificada.
Conclusão
Neste artigo, aprendemos como são os tipos de dados datetime e datetime2, suas principais diferenças e como garantir que você esteja inserindo a data correta ao usar esses tipos de dados. No decorrer dele, também examinamos dois erros que um desenvolvedor pode encontrar ao trabalhar com esses tipos de dados.
Referências
- Tipos de dados SQL
- Ben-Gan, I. (2016) Fundamentos de T-SQL. pp74-78. Imprensa da Microsoft.