Trabalhando 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
  

Mensagemem Seg, 17 Mar 2008 6:05 pm

Olá pessoal, boa tarde. Estou com a seguinte duvida.
Tenho uma tabela com cotação de dolar e preciso retornar o primeiro dia util do mês atual e o ultimo dia util do mês anterior. Eu vi vários comandos mas eu consegui só retornar o mês atual (fazendo um select com max) e o mês anterior (-1) mas a data completa (DD/MM/YYYY) eu não estou conseguindo. Poderiam me ajudar, sou nova no PL/SQL e estou apanhando um pouco rsrsrs.
Obrigada! :)
krecchi
Localização: São Paulo

KRecchi

Mensagemem Ter, 18 Mar 2008 10:00 am

Bom dia,

Pra pegar o primeiro dia útil, faça da seguinte forma (pode criar uma função com o código abaixo, passando a data como parâmetro e, retornando uma data útil):
Código: Selecionar todos

declare
  v_data         date;
  v_primeiro_dia number;
begin
   
   -- Primeiro dia do mês
   select  trunc(sysdate,'MM')
     into v_data
     from dual;

   -- Se for sábado ou domingo, pula dias. 
   if to_char(v_data,'D') = '7'
   then
      -- Se for sábado, joga pra segunda
      v_data := v_data + 2;
   elsif to_char(v_data,'D') = '1'
   then
      -- Se for sábado, joga pra segunda     
      v_data := v_data + 1;
   end if;

   dbms_output.put_line('Dia util: '||to_char(v_data,'dd/mm/rrrr'));   
 
  -- 7 sab
  -- 1 dom
 
end;     


Para o último dia, você pode passar pela mesma função, passando como parâmetro de data, o Last_Day dessa data.

qualquer coisa, manda ai.
Trevisolli
Localização: Araraquara - SP

Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Mensagemem Ter, 18 Mar 2008 10:02 am

Obrigada! Vou tentar
krecchi
Localização: São Paulo

KRecchi

Mensagemem Ter, 18 Mar 2008 12:54 pm

O Trevisolli, pra que complicar, Criança......??? :shock:

usa só isso...ex...

select last_day(sysdate),last_day(add_months(sysdate,-1)),last_day(add_months(sysdate,-1)) +1 from dual;
ruevers
Localização: sp


Mensagemem Ter, 18 Mar 2008 12:57 pm

agora o detalhe....
faltou o dia util...
mas se usar a função NEXT_DAY a e um DECODE, dá pra colocar tudo num select só, eu só dei a dica aí em cima, porque acho que não precisa de função, da pra por tudo no select, mas fuçar um pouco no select consegue fazer tudo sim.
ruevers
Localização: sp


Mensagemem Ter, 18 Mar 2008 4:45 pm

OBRIGADA TAMBEM VOU TENTAR! VALEU A TODOS! :)
krecchi
Localização: São Paulo

KRecchi

Mensagemem Qui, 20 Mar 2008 11:07 am

agradeço a todos a ajuda e segue o que eu fiz, foi utilizado duas funções;

Código: Selecionar todos
CREATE OR REPLACE FUNCTION OBTEMULTDIAUTIL ( p_data_ult date) return date   is
  w_ult_dia_util date;
  w_dummy        char(1); 
  BEGIN
      w_ult_dia_util := p_data_ult;
        LOOP
          w_ult_dia_util:= w_ult_dia_util - 1 ;
          if to_char ( w_ult_dia_util , 'D' )  not in ( 1,7 ) then
             BEGIN
                select 'x'
                  into w_dummy
                  from TABELADEFERIADOS
                 where DATAFERIADO = w_ult_dia_util
                   and rownum = 1 ;
                EXCEPTION
                  WHEN NO_DATA_FOUND THEN  EXIT ;
             END;
          end if ;
        END LOOP; 
       return w_ult_dia_util;
  END OBTEMULTDIAUTIL;
 
CREATE OR REPLACE FUNCTION primdiautil (mês NUMBER, ano NUMBER)
RETURN DATE IS
  cont INTEGER;
  dataa  DATE;
  diamesano char(10);
BEGIN
  dataa := null;
  /* Faz consist?ncia do m?s */
  IF mês < 13 And mês > 0 THEN
    FOR cont in 1..31 LOOP
      BEGIN
      /* verifica se o dia n?o ? final de semana ou feriado */
      diamesano := LTRIM(To_char(cont,'99'))||'/'||LTRIM(To_char(mês,'99'))||'/'||
                 LTRIM(To_char(ano,'9999'));
      SELECT DATAFERIADO INTO dataa
        FROM TABELADEFERIADO
        WHERE DATAFERIADO = to_date(diamesano,'dd/mm/yyyy')  ;
        dataa := null;
      EXCEPTION WHEN NO_DATA_FOUND THEN
        dataa := to_date(diamesano,'dd/mm/yyyy')  ;
        IF To_char(dataa,'D') <> 7 AND To_char(dataa,'D') <> 1 THEN
          EXIT;
        Else
         dataa :=  null;
        END IF;
      END;
    END LOOP;
  END IF ;
  RETURN (dataa);
END;

/** PROCEDURE DE ATUALIZACAO DOLAR**/
create or replace procedure pAtu_DOLAR
as
/***************************/
   --Variaveis para tratamento da atualização do dolar do primeiro para ultimo dia.
   vDATATRAT       DATE;
   vPDUMS          DATE;
   ano_ant         char(4);
   mes_ant         char(2);
   data_ant        date;
/***************************/
begin

  /* seleciona primeiro dia util do mês seguinte ao mês base em calculo */
   SELECT  MAX (TO_DATE((DTBRTDTBARE),'MMYYYY')) INTO vDATATRAT FROM  TABELADATABASE;

   /* calcula primeiro dia util do mês seguinte */
   vPDUMS   := frtprimdiautil(TO_CHAR(vDATATRAT,'MM'),TO_CHAR(vDATATRAT,'YYYY'));

   /* calcula o ultimo dia util do mês anterior */
    vDATATRAT := ADD_MONTHS(vDATATRAT,-1);

    MES_ANT:= (TO_CHAR((vDATATRAT),'MM'));
    ANO_ANT:= (TO_CHAR((vDATATRAT),'YYYY'));
   
    data_ant := frtobtemultdiautil(last_day(to_date('01/' || mes_ant || '/' || ano_ant, 'DD/MM/YYYY')) + 1);
   
    /* atualiza do dolar com o valor do ultimo dia ultil */
    UPDATE TABELADOLAR T
    SET T.INDICE = (SELECT INDICE FROM TABELADOLAR WHERE TIPOINDICE = 'DOLAR VEN'
                                AND INDRTDTINDE = data_ant) 
    WHERE T.DATA = vPDUMS;
    commit;
   
end;
krecchi
Localização: São Paulo

KRecchi


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


    Voltar para PL/SQL

    Quem está online

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