Olá pessoal, neste post vamos abordar as funções de data, sua importância e como tratar e converter colunas com estes valores e além disso, vamos entender como o SQL Server atua com essas colunas no banco de dados e como cada função deste grupo funciona.

Sempre que criamos uma tabela e esta tabela possui alguma coluna que precisa registrar o tempo ou, até mesmo, quando executamos algum outro comando de manutenção que envolve tempo, o SQL realiza algumas conversões internas para trabalhar de forma otimizada com este tipo de arquivo.

O engine do banco irá trabalhar sempre com base no horário do sistema operacional através de uma API e o positivo é que a precisão com a qual ele executa e registra operações que envolvem tempo pode ser de até 100 nanosegundos de diferença, pois pode ocorrer variação de acordo com o hardware.

Tipos de dados para colunas temporais:

O SQL server permite armazenar valores temporais nos seguintes tipos:

  • Time
  • Date
  • Smalldatetime
  • Datetime
  • Datetime2
  • Datetimeoffset

Cada um destes tipos possui características e precisões diferentes e irei deixar o link da documentação do T-SQL aqui para consulta.

No exemplo abaixo, mostro como o SQL Server armazena cada um dos datatypes mencionados acima.

NOTA: O tipo TIME não foi inserido pois como houve uma conversão explícita, a coluna não permitia, porém, esse tipo armazena apenas hora/minuto e segundo. e os nanosegundos com precisão de até 100 nanosegundos.

Quando criamos uma coluna onde especificamos seu tipo como TIME, DATETIME, SMALLDATETIME e etc, se não houver o horário da inserção, o SQL Server assume como zero para todos os valores.

E se a data não for especificada, o sistema do banco irá assumir como data padrão 01/01/1900. Veja abaixo:

Podemos corrigir este comportamento padrão utilizando uma CONSTRAINT de default no momento da inserção de valores, seja por uma aplicação ou de forma manual.

Reparem que há uma CONSTRAINT criada para a coluna DATAHORA que me faculta inserir manualmente um valor nela. Veja abaixo:

NOTA: Se por algum motivo quiser saber quais os timezone que o SQL Server armazena em sua configuração interna, use a view de sistema:
SELECT * FROM SYS.time_zone_info

FUNÇÕES QUE RETORNAM DATA E HORA

Agora que vimos como cada tipo de data type funciona para armazenar datas no banco de dados, vamos ver nos próximos exemplos, como podemos utilizar funções internas para retornar hora e data do sistema operacional e até mesmo usar como no exemplo anterior em CONSTRAINTS para inserção.

As funções são divididas em mais precisas e menos precisas e sua precisão pode variar de acordo com a potência do hardware mas, normalmente, as mais precisas possuem uma precisão de 100 nanosegundos de diferença com o sistema.

Abaixo, as funções classificadas como de alta precisão:

  • Sysdatetime;
  • Sysdatetimeoffset;
  • Sysutcdatetime.

NOTA: Sysdatetimeoffset é a única que retorna o formato datetimeoffset, as outras duas retornam datetime2.

Veja abaixo, as funções sendo utilizadas retornando a hora do meu sistema operacional:

Como o fuso brasileiro está  -03:00 de diferença do horário base universal, o SQL Server ao chamar a função SYSUTCDATETIME me retorna o horário padrão universal.

Agora, vamos ver quais as  funções que são de baixa precisão porém, retornam hora e data do sistema e podem ser usadas como default para INSERT.

A lógica nesta segunda classe de função é a mesma e a precisão não  é tão baixa quanto pensamos, porém, dependendo da situação, se a precisão do tempo um requisito, considere utilizar o primeiro grupo de função.

Abaixo, um comparativo entre as duas classes, uma utilizando o SYSDATETIME e a outra utilizando o GET_DATE. 

Os resultados envolvidos de preto mostram o resultado do primeiro grupo onde temos funções mais precisas e as sublinhadas de vermelho as de menor precisão. Reparem que a diferença é mínima.

Isso mostra que dependendo da necessidade e do ambiente, não compensa tanto utilizar funções mais precisas que podem acabar impactando de alguma forma seu servidor de banco.

Assim, para não estender mais o post, finalizado esta primeira parte mostrando apenas as funções e os data types e no próximo irei abordar operações e conversões com datas utilizando o SQL!

Até a próxima e saúde!