[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
  

Mensagemem Qua, 07 Dez 2005 3:24 pm

Executando a seguinte query, trará a semana do ano incorretamente...
Código: Selecionar todos
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...
Código: Selecionar todos
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
anderson
Localização: Toledo - PR

Anderson Nuernberg
---


Voltar para PL/SQL

Quem está online

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