Dia util

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
carla
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 25 Mai 2010 5:34 pm
Localização: SR-MG

Selecionar tudo

DECLARE 
v_i INTEGER; 
v_dia  INTEGER; 
v_data DATE;
v_c INTEGER; 

BEGIN
  v_c := 0;
  
  FOR v_i in 1..31 LOOP

      BEGIN
 
      v_data := LTRIM(To_char(v_i,'99'))||'/'||LTRIM(To_char($2,'99'))||'/'||
                 LTRIM(To_char($3,'9999'));
      
  
        if To_char(v_data,'D') <> 7 AND To_char(v_data,'D') <> 1 THEN 
          
          BEGIN
            SELECT CAB_DATA INTO v_data 
            FROM CAB
            WHERE CAB_DATA = to_date(v_data ,'dd/mm/yyyy')  ;
          EXCEPTION 
            WHEN NO_DATA_FOUND THEN
              v_data := to_date(v_data ,'dd/mm/yyyy')  ;
          
              IF $1 = 1 THEN
              v_dia = v_i;
              exit;
              ELSE
              v_c = v_c + 1; 
              end if;

              if v_c = 5 THEN
              v_dia = v_i;
              exit;
              end if;

           END;
        
       END IF;

      END;
    END LOOP;
  RETURN (v_dia);
END; 
Não estou conseguindo retornar i 1º dia util alguém poderia ajudar? Na minha tabela cab(tabela de feriados) a data é um timestamp.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

como assim n ta conseguindo qual e o seu real problema?
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Olá Carla,

Você poderia explicar para nós o que você precisa obter, em vez de como tentou solucionar o problema?

Se houver tabelas envolvidas, uma breve explicação e dados de exemplo ajudam também.
carla
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 25 Mai 2010 5:34 pm
Localização: SR-MG

Eu preciso fazer uma funcao que retorne para mim o 1º e o 5º dia util de um mês, que eu passo como argumento:

Selecionar tudo

diautil("p_i" integer, "mês" numeric, "ano" numeric)
ESte p_i é para ver se é o 1º ou o 5º dia util.

Tem uma tabela de feriados tambem para desconsiderá-los.

Estrutura da tabela:

Selecionar tudo

cab_data = timestamp without time zone ex= 2009-12-13 00:00:00

cab_esp = character varying(1) ex = F (Feriado)
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

Como você declarou v_data como date, nessa linha você deveria especificar já o formato da data (a string será convertida automaticamente para date caso contrário, segundo o formato da sua sessão):

Selecionar tudo

--      v_data := LTRIM(To_char(v_i,'99'))||'/'||LTRIM(To_char($2,'99'))||'/'||LTRIM(To_char($3,'9999')); 
        v_data := to_date( lpad( v_i, 2, '0') ||'/'|| lpad(&parametro2, 2, '0') || '/' || lpad( &parametro3, 4, '0' ), 'dd/mm/yyyy' );
Outra coisa: como v_data já é date, remova o to_date(...), pois pode vir a causar erros dependendo do formato passado e o formato padrão da sua sessão no banco:

Selecionar tudo

  
EXCEPTION 
--            WHERE CAB_DATA = to_date(v_data ,'dd/mm/yyyy')  ;
-- Como o campo já é date, basta apenas truncar o v_data para remover a informação de horas/minutos/segundos (não é preciso neste caso, mas não custa nada prevenir)
            WHERE CAB_DATA = trunc( v_data ); 
mesma situação nesta linha (neste caso, pode remover a linha toda sem problemas):

Selecionar tudo

            WHEN NO_DATA_FOUND THEN 
--              v_data := to_date(v_data ,'dd/mm/yyyy')  ; 
de resto, não notei mais nenhum problema (não tenho como testar no momento, mas acredito que esses ajustes resolvam o problema).


Uma outra forma de obter determinado dia útil ( se você estiver na versão 10g ou superior do banco ) poderia ser com uma consulta parecida com essa:

Selecionar tudo

select a.dia, to_number( to_char( a.dia, 'dd' ) ) from
(
  select d.dia, row_number() over ( order by d.dia asc ) dia_util
  from
  (
    select to_date( '01'
                  || '/' || lpad( &parametro2, 2, '0' ) 
                  || '/' || lpad( &parametro3, 4, '0' )
                  , 'dd/mm/yyyy' 
                  ) + rownum - 1 dia
    from   dual
    connect by level <= 31
  ) d
  where  to_char( d.dia, 'D' ) not in ( 1, 7 )
  and    not exists
  (
    select 1
    from   cab
    where  cab_data = d.dia
  )
) a
where a.dia_util = &parametro1
;
carla
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 25 Mai 2010 5:34 pm
Localização: SR-MG

Selecionar tudo

BEGIN
 
      v_data := LTRIM(To_char(v_i,'99'))||'/'||LTRIM(To_char($2,'99'))||'/'||
                 LTRIM(To_char($3,'9999'));
     
 
        if To_char(v_data,'D') <> 7 AND To_char(v_data,'D') <> 1 THEN
         
          BEGIN
            SELECT CAB_DATA INTO v_data
            FROM CAB
            WHERE CAB_DATA = trunc(v_data);
          EXCEPTION
            WHEN NO_DATA_FOUND THEN
         
              IF $1 = 1 THEN
              v_dia = v_i;
              exit;
              ELSE
              v_c = v_c + 1;
              end if;

              if v_c = 5 THEN
              v_dia = v_i;
              exit;
              end if;

           END;
       
       END IF;

      END; 
Eu uso postgres 8.2.4 e não esta dando certo esta EXCEPTION.
edson.amorim
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 135
Registrado em: Qui, 04 Out 2007 3:36 pm
Localização: Belo Horizonte - MG

Caro colega,

Estou aproveitando o seu código pois achei interessante esta situação porem, fiquei com a seguinte dúvida: Quais as informações que ela passa como parametro para esta rotina?? s´mesmo para entender>>>

Grato,
carla
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 25 Mai 2010 5:34 pm
Localização: SR-MG

Selecionar tudo

"p_i" integer, "mês" numeric, "ano" numeric
p_i é 1 ou 5 para saber se é o primeiro dia ou o quinto.

Carla.
carla
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 25 Mai 2010 5:34 pm
Localização: SR-MG

Só que não está dando certo quando verifico a tabela de feriados.
Responder
  • Informação