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;
Dia util
-
- Rank: Estagiário Pleno
- Mensagens: 5
- Registrado em: Ter, 25 Mai 2010 5:34 pm
- Localização: SR-MG
-
- Moderador
- Mensagens: 1396
- Registrado em: Sex, 01 Fev 2008 2:06 pm
- Localização: Rio de Janeiro - RJ
- Contato:
como assim n ta conseguindo qual e o seu real problema?
- fsitja
- 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
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.
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.
-
- 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:
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:
diautil("p_i" integer, "mês" numeric, "ano" numeric)
Tem uma tabela de feriados tambem para desconsiderá-los.
Estrutura da tabela:
cab_data = timestamp without time zone ex= 2009-12-13 00:00:00
cab_esp = character varying(1) ex = F (Feriado)
-
- 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):
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:
mesma situação nesta linha (neste caso, pode remover a linha toda sem problemas):
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:
-- 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(¶metro2, 2, '0') || '/' || lpad( ¶metro3, 4, '0' ), 'dd/mm/yyyy' );
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 );
WHEN NO_DATA_FOUND THEN
-- v_data := to_date(v_data ,'dd/mm/yyyy') ;
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:
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( ¶metro2, 2, '0' )
|| '/' || lpad( ¶metro3, 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 = ¶metro1
;
-
- Rank: Estagiário Pleno
- Mensagens: 5
- Registrado em: Ter, 25 Mai 2010 5:34 pm
- Localização: SR-MG
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;
-
- 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,
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,
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Bing [Bot] e 1 visitante