Olá Galera,

Neste artigo iremos desenvolver uma rotina onde nos informe quem são os proximos aniversariantes. Dado um valor para este parâmetro.

Vamos lá!

A idéia é a seguinte:

Iremos ter em nossa tabela de parâmetros os dias posteriores para pesquisa dos aniversariantes.

Por exemplo: 5 dias. Ou seja, se estivermos no dia 01 ele irá pegar até o dia 6.

Mãos na Massa!!!

Vamos criar uma tabela que armazene nosso parâmetro de dias posteriores. 
Ela terá o nome de Params e possuirá 2 campos, conforme sintaxe abaixo:

Create Table Params(
Nome VarChar(15),
Valor VarChar(15)
)

Esta tabela se trata de todos os valores de parâmetros cadastrados no sistema. Não somente ao valor dos aniversariantes posteriores.

Insira o valor de nosso parametro na tabela, conforme sintaxe:

Insert Params values( 'G_DANIV' , '5' )

Bem, com isso temos a informação ja cadastrada em nossa base de dados.

Vamos, agora, fazer com que seja exibido nossos funcionarios.

Para isto, sera necessario criarmos uma tabela para exemplo. 

Criei uma tabela bem simples, conforme sintaxe abaixo:

Create Table Func(
CodFunc Char(4),
Nome VarChar(60),
DtAniver DateTime
)

Vamos inserir alguns registros nesta tabela para podermos testar nossa nova rotina.

Insert Func( CodFunc, Nome, DtAniver ) Values( '0001' , 'Adriano' , '1985-05-01' )
Insert Func( CodFunc, Nome, DtAniver ) Values( '0002' , 'Jose Carlos' , '1987-05-04' )
Insert Func( CodFunc, Nome, DtAniver ) Values( '0003' , 'Fabricio' , '1990-05-03' )
Insert Func( CodFunc, Nome, DtAniver ) Values( '0004' , 'Douglas' , '1981-05-05' )
Insert Func( CodFunc, Nome, DtAniver ) Values( '0005' , 'Emerson de Lima' , '1980-05-02' )
Insert Func( CodFunc, Nome, DtAniver ) Values( '0006' , 'Anderson Costa' , '1995-05-06' )
Insert Func( CodFunc, Nome, DtAniver ) Values( '0007' , 'Henrique' , '1971-05-27' )
Insert Func( CodFunc, Nome, DtAniver ) Values( '0008' , 'Paulo Amaral' , '1976-05-29' )
Insert Func( CodFunc, Nome, DtAniver ) Values( '0009' , 'Guinter Pauli' , '1977-05-28' )
Insert Func( CodFunc, Nome, DtAniver ) Values( '0010' , 'Mauro Pichiliani' , '1974-05-30' )
Insert Func( CodFunc, Nome, DtAniver ) Values( '0011' , 'Wilson' , '1980-05-31' )
Insert Func( CodFunc, Nome, DtAniver ) Values( '0012' , 'Ayrton' , '1978-06-01' )
Insert Func( CodFunc, Nome, DtAniver ) Values( '0013' , 'Kleber' , '1981-06-02' )
Insert Func( CodFunc, Nome, DtAniver ) Values( '0014' , 'Da Vinci' , '1982-06-03' )
Insert Func( CodFunc, Nome, DtAniver ) Values( '0015' , 'Monalisa' , '1982-06-04' )

Pronto! Incluímos nosso dados fictícios.

Agora vamos criar uma View para trazer nosso aniversariantes. Conforme parâmetro configurado anteriormente.

Create View Aniversariantes    
 as     
Select CodFunc, Nome, DtAniver,    
   DATEDIFF ( dd , GetDate() , Cast( SubString( Convert( Char(10) , GetDate() , 103) , 7, 4 ) + '-' +    
   SubString( Convert( Char(5)  , DtAniver , 103) , 4, 2 ) + '-' +    
   SubString( Convert( Char(5)  , DtAniver , 103) , 1, 2 ) as DateTime )  ) As Dif    
From Func    
Where DATEDIFF ( dd , GetDate() , Cast( SubString( Convert( Char(10) , GetDate() , 103) , 7, 4 ) + '-' +    
   SubString( Convert( Char(5)  , DtAniver , 103) , 4, 2 ) + '-' +    
   SubString( Convert( Char(5)  , DtAniver , 103) , 1, 2 ) as DateTime ) ) Between 0 and ( Select Valor from params Where Nome = 'G_DANIV' )   

Explicando a rotina.
No Select, acredito que a unica coisa diferente é o campo que criamos chamado "Dif".
Este campo nos traz a diferença de dias do aniversariante para a data atual. Tomando apenas o cuidado de não comparar o ano do aniversário com o ano atual. Para isso, formatamos a data de aniversário de nosso funcionário para o ano em questão, conforme sintaxe:
Cast( SubString( Convert( Char(10) , GetDate() , 103) , 7, 4 ) + '-' +    
    SubString( Convert( Char(5)  , DtAniver , 103) , 4, 2 ) + '-' +    
      SubString( Convert( Char(5)  , DtAniver , 103) , 1, 2 ) as DateTime )

Com a sintaxe acima, assumimos que o nosso funcionário nasceu no ano em questão.

Utilizamos a função do SQL chamada "DateDiff" passando o parâmetro "dd". Ou seja, queremos que o retorno seja em dias das datas comparadas. 

Entendeu para que a conversa do ano do aniversário para o ano atual?

Em nosso filtro where fazemos a comparação dos dias retornados com os dias do parametro. Observe que incluímos a partir do 0. Ou seja, aniversariantes do dia.

Apos criarmos nossa View. Vamos testar nossa rotina trazendo as informacoes.

Para isso, execute o comando abaixo:

SELECT * FROM ANIVERSARIANTES ORDER BY DIF

E repare no resultado:




Pronto!!!

Nossa rotina esta desenvolvida e funcionando conforme o esperado...

Espero que tenham gostado...

Grande Abraco