Fórum Aniversariantes #270435

28/02/2005

0

TEnho um formulario q esta usando um SQl para pesquisar usuarios q fazem aniversario entre duas datas q o usuario informa, o sql q estou isando eh esse:

WHERE ((EXTRACT(MONTH FROM Usu_nascimento) = :MES1) AND (EXTRACT(DAY FROM Usu_nascimento) >= :DIA1)) OR ((EXTRACT(MONTH FROM Usu_nascimento) = :MES2) AND (EXTRACT(DAY FROM Usu_nascimento) <= :DIA2)) OR ((EXTRACT(MONTH FROM Usu_nascimento) > :MES1) AND (EXTRACT(MONTH FROM Usu_nascimento) < :MES2))


mas quando o kra informa duas datas iguais o sql mostra varios registros q naum tem nada haver, com o q eh pedido.

Alguem teria alguma outra solução para esse problema, ou corrigir esse comando no meu sql.


Zunker

Zunker

Responder

Posts

28/02/2005

Koplin

where
((EXTRACT(DAY FROM Usu_nascimento) >= :DIA1) AND
(EXTRACT(MONTH FROM Usu_nascimento) >= :MES1))
and ((EXTRACT(DAY FROM Usu_nascimento) <= :DIA2) AND
(EXTRACT(MONTH FROM Usu_nascimento) <= :MES2))


Responder

Gostei + 0

01/03/2005

Zunker

Neste caso vai acontecer mesma coisa q o outro sql, quando o usuario informar duas datas iguais....xD


Responder

Gostei + 0

01/03/2005

Zunker

Antigamente eu usava deste jeito:

WHERE (extract(month from Usu_nascimento) BETWEEN :mes1 AND :mes2) and (extract(day from Usu_nascimento) between :dia1 and :dia2)


Soh q dai se tu informava um valor por exemplo entre 28/02 e 01/03, dai eh como se naum tivesse Aniversariantes nestas datas sendo q tem +/- uns 300 usuarios q fazem aniversario nesse intervalo.....xD


Responder

Gostei + 0

01/03/2005

Beppe

E assim: :roll:
WHERE (EXTRACT(MONTH FROM Usu_nascimento) between :MES1 and :MES2) and
(((EXTRACT(MONTH FROM Usu_nascimento) = :MES1 and EXTRACT(DAY FROM Usu_nascimento) >= :DIA1) or
((EXTRACT(MONTH FROM Usu_nascimento) = :MES2 and EXTRACT(DAY FROM Usu_nascimento) <= :DIA2)))



Responder

Gostei + 0

01/03/2005

Motta

Converta a data da tabela para um ano padrao e teste em cima deste ano, fica uma passagem simples de parametros, o único problema é tratar um intervalo entre anos 25/dez a 06/jan, mas isto pode ser resolvido por um union 25 a 31 e 01 a 06.


Responder

Gostei + 0

01/03/2005

Zunker

E assim: :roll:
WHERE (EXTRACT(MONTH FROM Usu_nascimento) between :MES1 and :MES2) and
(((EXTRACT(MONTH FROM Usu_nascimento) = :MES1 and EXTRACT(DAY FROM Usu_nascimento) >= :DIA1) or
((EXTRACT(MONTH FROM Usu_nascimento) = :MES2 and EXTRACT(DAY FROM Usu_nascimento) <= :DIA2)))


Neste caso esta quase certo pois se o kra informa as mesmas datas soh informa todos do mesmo mes, mas naum chega a informa todos soh da data, por exemplo se ele informar 07/03 e 07/03.

E motta eu naum entendi a sua explicação, pois nunca mexi desta maneira, naumteria um exemplo pra me explicar melhor.

Desde jah obrigado pela atenção....xD


Responder

Gostei + 0

01/03/2005

Emerson Nascimento

tente assim:

WHERE (Extract(MONTH from Usu_nascimento) between :Mes1 and :Mes2)
  and ((Extract(MONTH from Usu_nascimento) = :Mes1
            and Extract(DAY from Usu_nascimento) >= :Dia1) or 
       (Extract(MONTH from Usu_nascimento) = :Mes2 
            and Extract(DAY from Usu_nascimento) <= :Dia2) or
       (Extract(MONTH from Usu_nascimento)<>:Mes1 
            and Extract(MONTH from Usu_nascimento)<>:Mes2)
      )



Responder

Gostei + 0

01/03/2005

Zunker

tente assim:
WHERE (Extract(MONTH from Usu_nascimento) between :Mes1 and :Mes2)
  and ((Extract(MONTH from Usu_nascimento) = :Mes1
            and Extract(DAY from Usu_nascimento) >= :Dia1) or 
       (Extract(MONTH from Usu_nascimento) = :Mes2 
            and Extract(DAY from Usu_nascimento) <= :Dia2) or
       (Extract(MONTH from Usu_nascimento)<>:Mes1 
            and Extract(MONTH from Usu_nascimento)<>:Mes2)
      )


Neste caso

(Extract(MONTH from Usu_nascimento)<>:Mes1 
            and Extract(MONTH from Usu_nascimento)<>:Mes2)


seria descartado, pois tu jah vai tar definindo em

(Extract(MONTH from Usu_nascimento) between :Mes1 and :Mes2)


Entaum seria o mesmo q este esquema q jah foi passado aki no topico

WHERE (EXTRACT(MONTH FROM Usu_nascimento) between :MES1 and :MES2) and
(((EXTRACT(MONTH FROM Usu_nascimento) = :MES1 and EXTRACT(DAY FROM Usu_nascimento) >= :DIA1) or
((EXTRACT(MONTH FROM Usu_nascimento) = :MES2 and EXTRACT(DAY FROM Usu_nascimento) <= :DIA2)))


Mas mesmo assim obrigado pela atenção


Responder

Gostei + 0

01/03/2005

Motta

sou meio bitolado no sql do Oracle pois fui o único que usei

temos duas funcoes

to_char - converte uma data para string

to_date - ´ uma string para data

seria algo assim

SELECT *
FROM CADASTRO
WHERE TO_DATE(TO_CHAR(DATA_NASCIMENTO,´DDMM´)||´1900´,´DDMMYYYY´)
BETWEEN TO_DATE(´01021900´,´DDMMYYYY´) AND TO_DATE(´15031900´,´DDMMYYYY´)


O PROBLEMA SERIA ALGO DO TIPO ENTRE ANOS
QUE PODERIA SER RESOLVIDO POR UM UNION

SELECT *
FROM CADASTRO
WHERE TO_DATE(TO_CHAR(DATA_NASCIMENTO,´DDMM´)||´1900´,´DDMMYYYY´)
BETWEEN TO_DATE(´25121900´,´DDMMYYYY´) AND TO_DATE(´31121900´,´DDMMYYYY´)
UNION ALL
SELECT *
FROM CADASTRO
WHERE TO_DATE(TO_CHAR(DATA_NASCIMENTO,´DDMM´)||´1900´,´DDMMYYYY´)
BETWEEN TO_DATE(´01011900´,´DDMMYYYY´) AND TO_DATE(´06011900´,´DDMMYYYY´)


Sou pouco didatico, mas entendeu ?


Responder

Gostei + 0

01/03/2005

Zunker

Eu nunca usei o Oracle, por isso talvez naum conheça essas funções, eu teria q ver se tem algo parecido com elas no InterBase, mas assim entendi a sua explicação.


Responder

Gostei + 0

01/03/2005

Motta

Acho que a CAST, mas não sei a sintaxe direito, tente o forum de IB/FB.


Responder

Gostei + 0

01/03/2005

Emerson Nascimento

no caso, Motta, não bastaria fazer

SELECT *
FROM CADASTRO
WHERE TO_CHAR(DATA_NASCIMENTO,´MMDD´) // invertido mesmo
BETWEEN TO_CHAR(:DataIni,´MMDD´) AND TO_CHAR(:DataFim,´MMDD´)

?

creio que assim funcione (no Oracle), pois assim seriam exibidos todos os aniversariantes independente do ano.


Responder

Gostei + 0

01/03/2005

Emerson Nascimento

olha a gambiarra:

instrução SQL para o IB/FB:
select * from usuarios
where extract(month from nascimento) + (cast(extract(day from nascimento) as numeric(5,2)) / 100)
between :Param1 and :Param2

no delphi, via passagem de parâmetros:
Params.ParamByName(´Param1´).AsString := FormatDateTime(´MM.DD´,Data);
Params.ParamByName(´Param2´).AsString := FormatDateTime(´MM.DD´,Data);
obs.: os parâmetros devem ser passados como [b:d7852409e7]AsString[/b:d7852409e7] mesmo.

ou direto:
select * from usuarios
where extract(month from nascimento) + (cast(extract(day from nascimento) as numeric(5,2)) / 100)
between 02.25 and 02.28

onde 02.25 e 02.28 é a data no formato MM.DD (obviamente, é um float)


Responder

Gostei + 0

01/03/2005

Motta

testei, não funcionou na ´virada´, creio que pela string do mes.


Responder

Gostei + 0

01/03/2005

Emerson Nascimento

humm... teoricamente deveria funcionar...

mas agora fiquei com uma dúvida:
[b:36bea54277]Zunker[/b:36bea54277], como a data é informada pelo usuário? Dia/Mês ou uma data completa, Dia/Mês/Ano?


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar