- 3. SQL Server, Datas e Horas: Tipos de dados
- 2. SQL Server, Datas e Horas: Exibição e Conversões
- 1. SQL Server, Datas e Horas
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
DBA Team Leader na Power Tuning