Apenas dias específicos do ano

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
Eric Araujo
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Sáb, 05 Out 2013 11:45 pm

Sou iniciante na area de pl/sql queria saber como crio um bloco anônimo que exiba durante 365 dias (1 ano) apenas as datas que caem no sábado e domingo, após a entrada de uma data. Após a solicitação da entrada da data, exibir sequencialmente a data e o dia da semana que representa essa data. Eu sei que consigo fazer apenas com um loop mas não estou acertando, os valores teriam que esta em ordem de data
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Rapaz,

fiz um sql que gera as datas a partir da data desejada até o ultimo dia do ano da data desejada.
Este bloco é montado dinamicamente e pode selecionar apenas os dias do fim de semana (1-Domingo e 7-Sábado).
Acredito que ajudará:

Selecionar tudo

SELECT *
  FROM (SELECT dia
             , TO_CHAR(dia, 'd') dia_semana
          FROM (SELECT data_inicial + LEVEL - 1 dia
                  FROM (SELECT TO_DATE(&MYDATE, 'DD/MM/RRRR') data_inicial
                          FROM dual)
                CONNECT BY LEVEL <=  (
                                      TO_DATE('31/12/' || (extract(YEAR FROM TO_DATE(&MYDATE, 'DD/MM/RRRR'))) , 'DD/MM/RRRR') - 
                                      TO_DATE(&MYDATE, 'DD/MM/RRRR')
                                      ) + 1))
WHERE 1 = 1
  AND dia_semana IN (1,7)
;
Eric Araujo
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Sáb, 05 Out 2013 11:45 pm

Obrigado pela ajuda, consiguir desenvolver esse loop que exibe o que preciso.

Selecionar tudo

DECLARE
v_DATA DATE := '&Digite_Data' ;
v_DATA_FIM DATE;
BEGIN
v_DATA_FIM := ADD_MONTHS(V_DATA, 12);
  FOR I IN 1..365 LOOP
    IF (TO_CHAR(v_DATA, 'D') IN (1,7) ) THEN
    DBMS_OUTPUT.PUT_LINE(v_DATA ||' - ' || TO_CHAR(V_DATA,'DAY'));
    END IF;
  v_DATA := v_DATA + 1;
  END LOOP;
END;
Preciso evoluir esse programa para exibir os feriados e sua descrição. eu criei uma tabela feriado, com data e descrição mas não consigo trazer essas informações, alguma idéia de trazer essas informações.

Selecionar tudo

create table feriado
( dt date,
 descricao varchar2(50)
);
insert into feriado values ( to_date('01/01/2011','dd/mm/yyyy'), 'Confraternização Universal');
insert into feriado values ( to_date('25/01/2011','dd/mm/yyyy'), 'Aniversário de São Paulo'  );
insert into feriado values ( to_date('08/03/2011','dd/mm/yyyy'), 'Carnaval');
insert into feriado values ( to_date('21/04/2011','dd/mm/yyyy'), 'Tiradentes');
insert into feriado values ( to_date('22/04/2011','dd/mm/yyyy'), 'Sexta-feira da Paixão');
insert into feriado values ( to_date('01/05/2011','dd/mm/yyyy'), 'Dia do Trabalho');
insert into feriado values ( to_date('23/06/2011','dd/mm/yyyy'), 'Corpus Christi');
insert into feriado values ( to_date('07/09/2011','dd/mm/yyyy'), 'Independência do Brasil');
insert into feriado values ( to_date('12/10/2011','dd/mm/yyyy'), 'Nossa Senhora Aparecida');
insert into feriado values ( to_date('02/11/2011','dd/mm/yyyy'), 'Finados');
insert into feriado values ( to_date('25/12/2011','dd/mm/yyyy'), 'Natal');
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Opa,
tinha entendido que contaria a partir de determinada data até o fim do ano.
Sua procedure, dentre alguns problemas, tem um problema de cara: anos bissextos.

Você está "programando" em plsql sem usar sql. Para fazer o que você deseja você terá que consultar sua tabela de feriados e verificar se existe aquela data.
Você poderia usar a estrutura que coloquei no inicio fazendo um outter join com sua tabela de feriados. Se existir então você exibe.
Mas tb você pode dentro do seu loop verificar na tabela de feriados se existe aquela data. se existir, então exibe.
Tinho
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 317
Registrado em: Seg, 16 Nov 2009 4:50 pm
Localização: São Paulo - SP

Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Google [Bot], Google Adsense [Bot] e 9 visitantes