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!
Trabalhando com datas
-
- 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
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):
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.
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):
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;
qualquer coisa, manda ai.
-
- 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.
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.
-
- 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;
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;
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 11 visitantes