> > 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
