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
Responder
krecchi
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qui, 18 Out 2007 7:55 am
Localização: São Paulo
KRecchi

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! :)
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

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

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

Selecionar tudo


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.
krecchi
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qui, 18 Out 2007 7:55 am
Localização: São Paulo
KRecchi

Obrigada! Vou tentar
ruevers
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 324
Registrado em: Sex, 02 Jun 2006 1:48 pm
Localização: sp
Contato:

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
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 324
Registrado em: Sex, 02 Jun 2006 1:48 pm
Localização: sp
Contato:

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.
krecchi
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qui, 18 Out 2007 7:55 am
Localização: São Paulo
KRecchi

OBRIGADA TAMBEM VOU TENTAR! VALEU A TODOS! :)
krecchi
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 7
Registrado em: Qui, 18 Out 2007 7:55 am
Localização: São Paulo
KRecchi

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

Selecionar tudo

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);
   mês_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);

    mês_ANT:= (TO_CHAR((vDATATRAT),'MM')); 
    ANO_ANT:= (TO_CHAR((vDATATRAT),'YYYY')); 
    
    data_ant := frtobtemultdiautil(last_day(to_date('01/' || mês_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;
Responder
  • Informação
  • Quem está online

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