>
> SELECT *
> FROM (
> SELECT
>     P.PES_IN_CODIGO,
>     C.COL_IN_CODIGO,
>     P.PES_ST_NOME,
>     TO_CHAR(P.PES_DT_NASCIMENTO,'DD/MM') AS PES_ST_ANIV,
>     CASE
>        WHEN TO_CHAR(P.PES_DT_NASCIMENTO,'MM') < TO_CHAR(SYSDATE,'MM')
> THEN TO_CHAR(ADD_MONTHS(SYSDATE,12),'YYYY') ||
> TO_CHAR(P.PES_DT_NASCIMENTO,'MMDD')
>         ELSE TO_CHAR(SYSDATE,'YYYY') || TO_CHAR(P.PES_DT_NASCIMENTO,'MMDD')
>     END AS PES_ST_ORDEM
> FROM PESSOA P
> LEFT JOIN COLABORADOR C ON P.PES_IN_CODIGO = C.PES_IN_CODIGO
> WHERE
>    (TO_CHAR(P.PES_DT_NASCIMENTO,'MM') = TO_CHAR(SYSDATE,'MM') AND
> TO_CHAR(P.PES_DT_NASCIMENTO,'DD') >= TO_CHAR(SYSDATE,'DD')) OR
>    (TO_CHAR(P.PES_DT_NASCIMENTO,'MM') =
> TO_CHAR(ADD_MONTHS(SYSDATE,1),'MM')) OR
>    (TO_CHAR(P.PES_DT_NASCIMENTO,'MM') =
> TO_CHAR(ADD_MONTHS(SYSDATE,2),'MM')) OR
>    (TO_CHAR(P.PES_DT_NASCIMENTO,'MM') =
> TO_CHAR(ADD_MONTHS(SYSDATE,3),'MM'))
> )
> ORDER BY PES_ST_ORDEM,PES_ST_NOME
>
> Tive que fazer com um subselect para poder ordenar da próxima data em
> diante.
>
> Obrigado a todos pela ajuda!
>

Thiago,
fiz uns testes aqui e consegui chegar numa consulta mais simples e q não tem
o problema do ano bissexto, porém nao sei a performance

SELECT * FROM pessoa where
to_date(to_char(dtnasc,'mmdd'),'mmdd')between
to_date(to_char(current_timestamp,'mmdd'),'mmdd')
and to_date(to_char(current_timestamp ,'mmdd'),'mmdd') + interval '3 month'

Como não passo o ano atual para o to_date, o postgresql atribui
automaticamente o ano 1 antes de cristo, nisso, passo todas as datas de
aniversario para o ano 1 antes de cristo mantendo o dia e o mes do
aniversario. Transformo então a data atual também para o ano 1 antes de
cristo, somo 3 meses na data convertida para o ano 1, assim todos que
estiverem nesse intervalo serão retornados.

[]s

Edson Souza
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a