3. SQL Server, Datas e Horas: Tipos de dados

Post [part not set]/3. Este post é parte da série: SQL Server: Esclarecendo Datas e Horas
Tempo de leitura estimado: 2 minutos

Salve amigos!

Data e hora no SQL Server pode parecer simples e fácil, principalmente para aqueles que já possuem alguma experiência, seja com administração, seja com desenvolvimento. Entender os principais aspectos de data e hora irão permitir construir scripts melhores e eficientes, além de evitar inconsistências ou surpresas nas aplicações.

Para finalizar esta série, vamos falar sobre os tipos de dado de data. Até o SQL Server 2005 somente dois tipos existiam para trabalhar com data e hora: smalldatetime e datetime. Estes sempre guardam a data e hora juntos. A partir do SQL Server 2008, mais alguns tipos surgiram: date, time, datetime2 e datetimeoffset. Date guarda somente data, gasta menos espaço e abrange uma faixa muito maior. Se você precisar guardar data de aniversário, por exemplo, ele é muito melhor do que o datetime.  O tipo time guarda somente a parte das horas. Além de gastar menos, a precisão das horas é muito maior. Talvez você já tenha percebido isso: o datetime possui uma precisão de cerca de 3,33 milissegundos apenas! Isto significa que… Blá, blá, blá! É melhor você ver na prática:

SELECT
	D.DataString
	,CONVERT(datetime,D.DataString) AS DataDatetime
FROM
(
	VALUES
		 ('20150101 23:59:59.002')
		,('20150101 23:59:59.004')
		,('20150101 23:59:59.005')
		,('20150101 23:59:59.006')
		,('20150101 23:59:59.009')
		,('20150101 23:59:59.011')
		,('20150101 23:59:59.012')
) D(DataString)

Tudo isso se deve ao formato como o datetime é armazenado internamente (assunto pra um futuro post). Mas o fato é que isso é uma realidade e tudo isso pode acontecer:

SELECT CONVERT(datetime,'20150101 23:59:59.002')
SELECT CONVERT(datetime,'20150101 23:59:59.004')
SELECT CONVERT(datetime,'20150101 23:59:59.005')
SELECT CONVERT(datetime,'20150101 23:59:59.006')
SELECT CONVERT(datetime,'20150101 23:59:59.009')
SELECT CONVERT(datetime,'20150101 23:59:59.011')
SELECT CONVERT(datetime,'20150101 23:59:59.012')

O tipo smalldatetime, tem uma precisão de 1 minuto. A seguinte query mostra a diferença entre os tipos datetime e smalldatetime:

SELECT
	D.DataString
	,CONVERT(smalldatetime,D.DataString) AS DataSmallDatetime
	,CONVERT(datetime,D.DataString) AS DataDatetime
FROM
(
	VALUES
		 ('20150101 23:59:59')
		,('20150101 23:59:30')
		,('20150101 13:15:29')
) D(DataString)

Executando a query acima (SQL 2008 ou superior, devido a cláusula VALUES), você irá perceber que quando os segundos passam são 30 ou superior, a data é arrendondada para o próximo minuto, quando é convertida para smalldatetime.

Já o tipo time tem uma precisão de 100 nanossegundos. O tipo time só armazena tempo, mas se você precisar armazenar data e hora com uma precisão maior, você pode usar o tipo datetime2. Apesar do nome maluco, ele é o tipo recomendando pela Microsoft por estas questões:

SELECT CONVERT(datetime2,'20150101 23:59:59.998')
SELECT CONVERT(datetime2,'20150101 23:59:59.999')
SELECT CONVERT(datetime2,'20150101 23:59:59.002')
SELECT CONVERT(datetime2,'20150101 23:59:59.004')
SELECT CONVERT(datetime2,'20150101 23:59:59.005')
SELECT CONVERT(datetime2,'20150101 23:59:59.006')
SELECT CONVERT(datetime2,'20150101 23:59:59.009')
SELECT CONVERT(datetime2,'20150101 23:59:59.011')
SELECT CONVERT(datetime2,'20150101 23:59:59.012')
SELECT CONVERT(time,'23:59:59.999')

Por padrão, estes tipos exibem 7 casas para os milissegundos. Você pode alterar este valor (quanto menor, menos espaço gasta). Você pode consultar a documentação para mais informações:

SELECT CONVERT(datetime2(3),'20150101 23:59:59.998')
SELECT CONVERT(datetime2(3),'20150101 23:59:59.999')
SELECT CONVERT(time(4),'23:59:59.999')
SELECT CONVERT(time(1),'23:59:59.999')

O tipo datetimeoffset2, além de fazer tudo isso demonstrado acima, ele inclui informações sobre o timezone. Para não ampliar o post, deixarei para falar dele depois. Lembre-se: Você pode obter muito mais informações na documentação do SQL Server. Acesse os links informados acima.

Data e hora são extremamente úteis e saber manipular dentro do SQL Server permite que você incremente suas soluções, melhore o desempenho e evite erros semânticos. Espero que este série possa ter esclarecido melhor. Qualquer coisa utilize os comentários!

Antes de finalizar, você sabe o que significa “Service Principal Name”? Aguarde os próximos posts…

 

[]’s
Navegue na série
Compartilhe este post!

Leave a reply

Your email address will not be published.