Problemas com filtragem de data

Firebird

27/02/2014

Olá pessoal, estou com o seguinte problema, eu preciso filtrar clientes que estão de aniversario num intervalo de 3 dias para frente e que passou, tipo Data de hoje - 3 e mais 3.
Criei uma SP para ajudar nesse quesito, não sei se seria a melhor opção, mas enfim, fiz assim:

FOR select C.cdcliente, C.nmcliente, C.dtnascimento, c.nrfone FROM CLIENTE C
where
(EXTRACT(DAY FROM C.DTNASCIMENTO) >= :DIAI AND EXTRACT(MONTH FROM C.DTNASCIMENTO) >= :MESI) AND
(EXTRACT(DAY FROM C.DTNASCIMENTO) <= :DIAF AND EXTRACT(MONTH FROM C.DTNASCIMENTO) <= :MESF)
ORDER BY EXTRACT(MONTH FROM C.DTNASCIMENTO), EXTRACT(DAY FROM C.DTNASCIMENTO)
INTO
:codigo, :nome, :data_nasc, :nrfone
DO
suspend;

Mas confesso que não está funcionando corretamente, nas variaveis DiaI, DiaF, MesI e MesF coloco o dia e o mes correspodente.
Acredito que tenha uma forma melhor de fazer, e espero que alguem possa me ajudar.
Utilizo Firebird 2.5
Até mais
Cristiano

Cristiano

Curtidas 0

Respostas

Marisiana Battistella

Marisiana Battistella

27/02/2014

Olá Cristiano!
Vê se esse SQL te ajuda...
select C.cdcliente, C.nmcliente, C.dtnascimento, c.nrfone FROM CLIENTE C 
where c.dtnascimento >= (select date_trunc('day', current_date) - INTERVAL '3 day')
and c.dtnascimento <= (select date_trunc('day', current_date) + INTERVAL '3 day')
GOSTEI 0
Alex Lekao

Alex Lekao

27/02/2014

Oi Marisiana,

ainda bem que vc apareceu... rsrsr

eu estava lendo e relendo e nao conseguia me encontrar no script do amigo. rsrsr

acho que estou lento hoje... mais que o normal... kkkk
GOSTEI 0
Cristiano

Cristiano

27/02/2014

Obrigadão Marisiana, mas infelizmente não deu certo, tem algum erro na sintaxe e sempre dá o erro no '3 day', e não consegui encontrar a solução.
Mas olhando pelo código, será que ele vai considerar apenas o dia e o mes para encontrar os aniversariantes do periodo?
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

27/02/2014

Oi Alex! =)
Faz parte...
Hoje também to assim, acho que é cansaço...
GOSTEI 0
Alex Lekao

Alex Lekao

27/02/2014

Deve ser viu...

meu Deus...

e eu devo estar ansioso pq nao vou trabalhar na segunda e nem no sabado... rsrsrsr

GOSTEI 0
Marisiana Battistella

Marisiana Battistella

27/02/2014

Obrigadão Marisiana, mas infelizmente não deu certo, tem algum erro na sintaxe e sempre dá o erro no '3 day', e não consegui encontrar a solução.
Mas olhando pelo código, será que ele vai considerar apenas o dia e o mes para encontrar os aniversariantes do periodo?


Ah, foi mal... Eu testei no PostgreSQL... Desculpa, confundi...
Assim ele deve pegar 3 dias antes e 3 dias depois da data atual...
GOSTEI 0
Alex Lekao

Alex Lekao

27/02/2014

vou ver se instalo o firebird em uma das minhas VMs aqui e restauro uma base para fazer teste...

testar as cegas eh osso... rsrsr
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

27/02/2014

select addday(current_date, 5)  from rdb$database


[url]https://www.devmedia.com.br/imagens/articles/192388/CoelhoFBUDF_2.jpg[/url]

Essa função "addday" pode ser utilizada para adicionar os dias a data atual, porém não estou encontrando uma função ou uma forma de diminuir os dias...
GOSTEI 0
Alex Lekao

Alex Lekao

27/02/2014

talvez funcione colocando -5.

select addday(current_date, -5)  from rdb$database


mas eh so especulação. rsrsr
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

27/02/2014

Pois é, pode ser...
Só usei Firebird nas aulas da minha graduação, depois nunca mais...
Mas tento ajudar pela lógica do SQL e pq tem coisas q são comuns em todos os bancos.
Eu acho q não firebird não tem essa função DATE_TRUNC porque eu não encontrei exemplos...
GOSTEI 0
Alex Lekao

Alex Lekao

27/02/2014

o Firebird que instalei aqui eh o 1.5

essa funcao nao funcionou nele nao... rsrsr

to pesquisando para ver se consigo alguma coisa...

conseguindo posto aqui... rsrs
GOSTEI 0
Alex Lekao

Alex Lekao

27/02/2014

ela eh para o Firebird 2.0 ou superior... rsrsr
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

27/02/2014

tente:

FOR select C.cdcliente, C.nmcliente, C.dtnascimento, c.nrfone
FROM CLIENTE C 
where
 substring(cast(C.DTNASCIMENTO as varchar(10)) from 6 for 5)
 between substring(cast(current_date-3 as varchar(10)) from 6 for 5) and
         substring(cast(current_date+3 as varchar(10)) from 6 for 5)
ORDER BY EXTRACT(MONTH FROM C.DTNASCIMENTO), EXTRACT(DAY FROM C.DTNASCIMENTO) 
INTO 
:codigo, :nome, :data_nasc, :nrfone 
DO 
suspend; 
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

27/02/2014

Cristiano, vc conseguiu criar a instrução SQL?
Nossas dicas t ajudaram?
GOSTEI 0
POSTAR