[Dica] - Semana do ano

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Avatar do usuário
anderson
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 75
Registrado em: Seg, 06 Jun 2005 1:08 pm
Localização: Toledo - PR
Contato:
Anderson Nuernberg
---

Executando a seguinte query, trará a semana do ano incorretamente...

Selecionar tudo

SQL> SELECT SYSDATE, to_char(SYSDATE,'WW') semana_ano
  2  FROM dual;

SYSDATE     SEMANA_ANO
----------- ----------
07/12/2005  49
isto ocorre porque o Oracle leva em conta o dia 01 de janeiro até o dia 07 de janeiro como a primeira semana, mas em muitos casos quando 01 de janeiro é em um sábado como no ano de 2005, dia 2 de janeiro já é a semana 2 do ano...

então criei uma função que calcula corretamente a semana do ano levando em conta que a semana começa no domingo...

Selecionar tudo

SQL> CREATE OR REPLACE FUNCTION fun_semana_ano(prm_data IN DATE) RETURN NUMBER IS
  2    wrk_nr_semana_ano  NUMBER;
  3    wrk_nr_dia_semana1 NUMBER;
  4    wrk_nr_dia_semana2 NUMBER;
  5  BEGIN
  6    --pego o dia da semana do primeiro dia do ano.
  7    wrk_nr_dia_semana1 := to_number(to_char(to_date('01-jan-'||to_char(prm_data,'RRRR')),'D'));
  8    --pego a semana do ano do Oracle
  9    wrk_nr_semana_ano  := to_number(to_char(prm_data,'WW'));
 10    --pego o dia da semana do parâmetro
 11    wrk_nr_dia_semana2 := to_number(to_char(prm_data,'D'));
 12    --se o dia da semana do parâmetro for menor que o dia da semana do dia 01/jan
 13    --então acrescento mais um a semana do ano do Oracle
 14    IF wrk_nr_dia_semana2 < wrk_nr_dia_semana1 THEN
 15      wrk_nr_semana_ano := wrk_nr_semana_ano + 1;
 16    END IF;
 17    --
 18    RETURN(wrk_nr_semana_ano);
 19  END;
 20  /

Function created

SQL> SELECT SYSDATE, fun_semana_ano(SYSDATE) semana_ano
  2  FROM dual;

SYSDATE     SEMANA_ANO
----------- ----------
07/12/2005          50
taí, espero que seja útil para alguém...

[]´s

:-o
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 12 visitantes