Mexendo com datas

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
jedi_pereira
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 16
Registrado em: Ter, 04 Dez 2007 2:12 pm
Localização: São Carlos - SP

olá,

estou com uma dúvida referente a manipulação de datas:
o usuario irá entrar com um periodo (11/12/2007 a 14/12/2007, por exemplo) e tenho que colocar os dias da semana no relatório baseado nisso (terça, quarta, quinta).
Como que eu faço um select para dado um inicio e um fim, mostrar os dias da semana??

grato
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

você pode usar o nro do dia da semana, utilizando o TO_CHAR(sysdate,'D').
Dessa forma você terá o seguinte retorno.. :
1 - Domingo
2 - Segunda
3 - Terça
4 - Quarta
5 - Quinta
6 - Sexta
7 - Sabado..

ou você pode alterar o idioma da sua seção e no seu select pedir o dia da semana..

ex:

Selecionar tudo

SQL> ALTER SESSION SET nls_language='brazilian portuguese'
  2  /

Session altered.
SQL> SELECT TO_CHAR( sysdate ,'d') nro_dia, TO_CHAR( sysdate ,'day') dia_semana FROM dual
  2  /

N DIA_SEMANA
- -------------
3 terça-feira
[]'s
jedi_pereira
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 16
Registrado em: Ter, 04 Dez 2007 2:12 pm
Localização: São Carlos - SP

vlw, mas como que adiciono um periodo a isso??
creio q tem que ser um FOR, mas seria o que no lugar de sysdate?

tipo:
select
for I in 11/12/2007..14/12/2007 loop
to_char (I, 'day')
end loop
from dual

(isso não deu certo)
??
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Sim, teria q ter um FOR sim..
da uma olhada nesse exemplo..

Selecionar tudo

SQL> DECLARE
  2     v_DT_INI         DATE := SYSDATE;
  3     v_DT_FIM         DATE := SYSDATE+4;
  4     v_DIAS           NUMBER;
  5  BEGIN
  6  
  7     EXECUTE IMMEDIATE ('ALTER SESSION SET nls_language=''brazilian portuguese'' ');
  8  
  9     v_DIAS := v_DT_FIM-v_DT_INI;
 10     
 11     FOR dt IN 0..v_DIAS-1 LOOP
 12        dbms_output.put_line( TO_CHAR(v_DT_INI+DT,'DD/MM/YYYY')||', '||TO_CHAR(v_DT_INI+DT,'DAY')
 );
 13     END LOOP;
 14     
 15  END;
 16  /
11/12/2007, TERÇA-FEIRA
12/12/2007, QUARTA-FEIRA
13/12/2007, QUINTA-FEIRA
14/12/2007, SEXTA-FEIRA

PL/SQL procedure successfully completed.
[]'s
jedi_pereira
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 16
Registrado em: Ter, 04 Dez 2007 2:12 pm
Localização: São Carlos - SP

vlw
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Selecionar tudo

select dat_intervalo
     , to_char(dat_intervalo, 'DAY','nls_date_language=portuguese')
from
(
  select dat_inicio + d.rnum dat_intervalo - 1
  from   
  (
    select rownum rnum
    from dual 
    connect by level <= trunc(dat_fim) - trunc(dat_inicio) + 1
  )
) 
Responder
  • Informação