Se você tivesse nascido ontem, obviamente hoje você teria um dia de idade. Agora responda rápido, e em SQL: qual o número de dias vividos por você até hoje?
Aprenderemos neste artigo a trabalhar com funções de data no SQL Server. As principais são: GETDATE, DATEPART, DATEADD e DATEDIFF.
Um detalhe importante é que as funções de data trabalham referenciando unidades de data. As mais comuns são:
- year(ano);
- month(mês);
- day(dia);
- month(mês);
- day(dia);
Observações:
1) o Books OnLine do SQL Server apresenta a lista completa desses parâmetros de valores ( unidades ), bem como outras funções de data;
2) as configurações de data para esse artigo estão no formato americano. Logo, a data 02/01/2004 deve ser lida como primeiro de fevereiro de 2004.
GETDATE ( )
A função GETDATE retorna a data e a hora atuais do sistema. Podemos, no Query Analyzer , digitar o seguinte comando para obter a data e hora atuais:
SELECT GETDATE ( )
DATEPART ( unidade , data )
A função DATEPART retorna a parte especificada de uma data como um inteiro. Observe os exemplos:
SELECT DATEPART ( YEAR , '02/01/2004' )
Reposta: 2004
SELECT DATEPART ( MONTH , '02/01/2004' )
Reposta: 2
SELECT DATEPART ( DAY , '02/01/2004' )
Reposta: 1
DATEADD ( unidade , numero_unid,data )
A função DATEADD retorna uma nova data através da soma do número de unidades especificadas pelo valor unidade a uma data. Observe os exemplos:
SELECT DATEADD ( DAY ,6, '02/01/2004' )
Reposta: 2004-02-07
SELECT DATEADD ( MONTH ,6, '02/01/2004' )
Reposta: 2004-08-01
SELECT DATEADD ( YEAR ,6, '02/01/2004' )
Reposta: 2010-02-01 DATEDIFF ( unidade , data1,data2 )
A função DATEDIFF calcula a diferença entre as datas data2 e data1 , retornando o resultado como um inteiro, cuja unidade é definida pelo valor unidade . Observe os exemplos:
SELECT DATEDIFF ( DAY , '02/01/2004' , '05/25/2004' )
Reposta: 114 (dias)
SELECT DATEDIFF ( MONTH , '02/01/2004' , '05/25/2004' )
Reposta: 3(meses)
SELECT DATEDIFF ( YEAR , '02/01/2004' , '05/25/2006' )
Reposta: 2(anos) Dessa forma, a expressão SQL que retorna o número de dias vivido por você até hoje é:
Select dateadd(day,-1,(dateadd(month,1,convert(char(08),getdate(),126)+'01')))Retorna o último dia do mês.
SELECT DATEDIFF(DAY, suadata, GETDATE())
onde suadata deve ser substituída pela sua data de nascimento.
Outro exemplo interessante é mostrado através do código T-SQL abaixo. Usando funções de data, exibimos, para cada cliente, a idade em dias, meses e em anos (idade do cliente na data atual e em 31 de dezembro). Observe a lógica utilizada no comando CASE. Neste caso, é testado se o cliente já fez aniversário, comparando o mês em que ele nasceu com o mês corrente e comparando o dia em que ele nasceu com o dia corrente. Se essa comparação for verdadeira, basta diminuir o ano atual do ano de nascimento do cliente. Caso contrário (o cliente ainda não fez aniversário), temos que diminuir 1 do valor anterior.
SELECT NOME, NASCIMENTO,
DATEDIFF(DAY,NASCIMENTO,GETDATE())AS DIASVIVIDOS,
DATEDIFF(MONTH,NASCIMENTO,GETDATE()) AS MESESVIVIDOS,
CASE WHEN
DATEPART(MONTH,NASCIMENTO)<= DATEPART(MONTH,GETDATE()) AND
DATEPART(DAY,NASCIMENTO)<= DATEPART(DAY,GETDATE())
THEN
(DATEDIFF(YEAR,NASCIMENTO,GETDATE()))
ELSE
(DATEDIFF(YEAR,NASCIMENTO,GETDATE()))- 1
END AS IDADEATUAL,
DATEDIFF(YEAR,NASCIMENTO,GETDATE())AS IDADE3112
FROM CLIENTE
DATEDIFF(DAY,NASCIMENTO,GETDATE())AS DIASVIVIDOS,
DATEDIFF(MONTH,NASCIMENTO,GETDATE()) AS MESESVIVIDOS,
CASE WHEN
DATEPART(MONTH,NASCIMENTO)<= DATEPART(MONTH,GETDATE()) AND
DATEPART(DAY,NASCIMENTO)<= DATEPART(DAY,GETDATE())
THEN
(DATEDIFF(YEAR,NASCIMENTO,GETDATE()))
ELSE
(DATEDIFF(YEAR,NASCIMENTO,GETDATE()))- 1
END AS IDADEATUAL,
DATEDIFF(YEAR,NASCIMENTO,GETDATE())AS IDADE3112
FROM CLIENTE
Vimos, neste artigo, exemplos do uso de funções de data no SQL Server. Outros SGBDs implementam funções de data, provavelmente com sintaxe diferente. Consulte a documentação do SGBD que você utiliza, para obter maiores detalhes.
Fontes: http://social.msdn.microsoft.com/Forums/pt-BR/520/thread/16524be2-a279-4546-9afa-a55f05c6221e
http://www.devmedia.com.br/post-1946-Funcoes-de-data-no-SQL-Server.html
Nenhum comentário:
Postar um comentário