Aprenda como Manipular Datas no SQL Server
Olá pessoal, hoje vou demonstrar algumas funções para manipular datas no SQL Server, meu objetivo é fazer alguns programadores perderem o medo em trabalhar com datas no formato “yyyy-mm-dd” (padrão ANSI), é muito comum encontrarmos campos com datas sendo gravadas como VARCHAR e no formato “dd/mm/yyyy“, essa “gambiarra” é feita para poder exibir de maneira legível para o usuário.
Outros posts sobre SQL Server que podem interessar:
Conexão PDO com SQL Server 2008 e 2012 no Ubuntu
Paginação com SQL Server 2008 R2 no PHP
DSN PDO – diversos bancos de dados
A maioria dos SGBDs possuem diversas funções para manipular e formatar datas, recentemente publiquei um post sobre como formatar datas no PostgreSQL, MySQL e SQL Server onde a ideia era pegar uma data no padrão ANSI e exibi-lá no formato brasileiro. Mas decidi aprofundar um pouco mais sobre assunto e nesse post vou demonstrar algumas funções para trabalhar com datas no SQL Server disponibiliza e deixa a vida do programador ainda mais fácil para trabalhar com datas no padrão ANSI.
Funções para manipular datas no SQL Server
Primeiro é importante salientar que, campo para gravar datas tem que ser com data type DATE, então já sabemos que as datas serão gravadas no formato “yyyy-mm-dd” e a partir disso vamos realizar cálculos, extrações e formatações.
Para esse post estou trabalhando com SQL Server 2012, em todos os exemplos vou sempre capturar o valor DATETIME retornado pela função nativa GETDATE() que retorna data e hora do servidor, as operações serão executadas com base na data exibida abaixo:
Função DATEPART()
A função DATEPART() retorna um fragmento da data informada, ou seja, ela pode retornar somente o dia, mês e ano, caso seja informado um DATETIME (incluindo hora) podemos obter também é possível obter fragmentos como hora, minuto, segundo e etc.
Essa função recebe 2 parâmetros, o primeiro parâmetro é a “parte” da data que queremos retornar exemplo YEAR, MONTH, DAY e etc., o segundo parâmetro é uma expressão contendo a data que basicamente tem que ser do tipo time, date, smalldatetime, datetime, datetime2 ou datetimeoffset. O retorno dessa função é um valor inteiro, documentação oficial:
1 2 3 4 5 6 7 8 |
/* Retorna o Dia */ SELECT DATEPART(DAY, GETDATE()) AS DIA; -- Resultado 9 /* Retorna o Mês */ SELECT DATEPART(MONTH, GETDATE()) AS MES; -- Resultado 8 /* Retorna o Ano */ SELECT DATEPART(YEAR, GETDATE()) AS ANO; -- Resultado 2015 |
Função DATEADD()
A função DATEADD() retorna um DATE de acordo com os parâmetros passados, basicamente podemos adicionar ou subtrair datas alterando dia, mês, ano e etc.
Essa função recebe 3 parâmetros, o primeiro parâmetro é a “parte” da data que vamos alterar exemplo YEAR, MONTH, DAY e etc., o segundo parâmetro é um valor inteiro se positivo adiciona ou se negativo subtrai, terceiro parâmetro é uma expressão contendo a data que basicamente tem que ser do tipo time, date, smalldatetime, datetime, datetime2 ou datetimeoffset. Mais informações na documentação oficial:
1 2 3 4 5 6 7 8 |
/* Adiciona 15 dias com base na data passada como parâmetro */ SELECT DATEADD(DAY, 15, GETDATE()); -- Resultado 2015-08-24 18:54:10.410 /* Adiciona 1 mês com base na data passada como parâmetro */ SELECT DATEADD(MONTH, 1, GETDATE()); -- Resultado 2015-09-09 18:54:59.523 /* Subtrai 2 anos com base na data passada como parâmetro */ SELECT DATEADD(YEAR, -2, GETDATE()); -- Resultado 2013-08-09 18:54:59.523 |
Função DATEDIFF()
A função DATEDIFF() basicamente retorna um valor inteiro contendo a diferença entre a 2 datas passadas como parâmetro, mas pode especificar se queremos essa diferença em dias, meses, anos ou etc.
Essa função recebe 3 parâmetros, o primeiro parâmetro é a “parte” da data que desejamo obter a diferença exemplo YEAR, MONTH, DAY e etc., o segundo parâmetro é uma expressão contendo a data inicial que basicamente tem que ser do tipo time, date, smalldatetime, datetime, datetime2 ou datetimeoffset e o terceiro parâmetro é a data final que desejamos obter a diferença. Mais informações na documentação oficial:
1 2 3 4 5 6 7 8 |
/* Obtendo a diferença em dias */ SELECT DATEDIFF(DAY, '2014-05-05', GETDATE()); -- Resultado 461 /* Obtendo a diferença em meses */ SELECT DATEDIFF(MONTH, '2014-05-05', GETDATE()); -- Resultado 15 /* Obtendo a diferença em anos */ SELECT DATEDIFF(YEAR, '2014-05-05', GETDATE()); -- Resultado 1 |
Função DATEFROMPARTS()
A função DATEFROMPARTS() foi implementada a partir da versão 2012 do SQL Server, ela constrói uma data e retorna um DATE baseado no ano, mês e dia passados como parâmetro.
Essa função recebe 3 parâmetros com valor inteiro, o primeiro parâmetro representa o ano, o segundo parâmetro representa o mês e o terceiro parâmetro representa o dia. Mas informações na documentação oficial:
1 2 |
/* Montando a data 2015-12-25 */ SELECT DATEFROMPARTS(2015, 12, 25); |
Formatando Data com a função CONVERT()
Tipo VARCHAR para tipo DATE
Nesse exemplo vamos usar uma data que está como VARCHAR e no formato “dd/mm/yyyy” e converte-lá para DATE no formato “yyyy-mm-dd”:
1 2 |
/* Converte a data passada como parâmetro para 2015-12-25 */ SELECT CONVERT(DATE, '25/12/2015', 103); |
Tipo DATE para tipo VARCHAR
Nesse exemplo vamos usar uma data do tipo DATE no formato “yyyy-mm-dd” e converte-lá para o tipo VARCHAR no formato “dd/mm/yyyy”:
1 2 |
/* Converte a data passada como parâmetro para 25/12/2015 */ SELECT CONVERT(DATE, '2015-12-25', 103); |
Observação: Nessa página é possível obter uma listagem completa dos valores que são aceitos no terceiro parâmetro, nesses exemplo usei “103” na conversão, esse parâmetro é conhecido como style.
Bom pessoal demonstrei nesse post as principais funções para manipular datas no SQL Server 2012, com o material postado acima o leitor não terá mais dúvidas ou receio em sempre gravar datas no padrão ANSI. Foi possível observar a gama de funcionalidades e operações que podemos executar com funções nativas e o principal de tudo com pouca complexidade, então fica a dica quando forem gravar datas utilizem o data type DATE, não tenham medo!
Se você gostou desse post compartilhe nas redes sociais e até a próxima …