Data No Oracle

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
Avatar do usuário
jeroqueiroz
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Qui, 18 Fev 2010 2:40 pm
Localização: Salvador - BA
Att,
Jeremias Santos - http://twitter.com/jeroqueiroz
JavaC - Java Community - http://www.javac.com.br
Twitter Fórum JavaC - http://twitter.com/javac_forum

Pessoal,

Estou com uma data cadastrada no banco e quero saber se o registro esta há mais de 30 dias vencido, sendo que possuo outra tabela que tem os feriados do ano.

Alguém tem alguma dica de como posso fazer isso no banco?

Qualquer dica e bem vinda...vlw!
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

pode testar direto

Selecionar tudo

select *
from suatabela
where (sysdate - seucampo) >= 30
aí tem que ver o lance do feriado..
Avatar do usuário
jeroqueiroz
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Qui, 18 Fev 2010 2:40 pm
Localização: Salvador - BA
Att,
Jeremias Santos - http://twitter.com/jeroqueiroz
JavaC - Java Community - http://www.javac.com.br
Twitter Fórum JavaC - http://twitter.com/javac_forum

vlw pela dica!

Realmente agora falta o tratamento do feriado.

Se alguém souber mais algo...

Desde já agradeço.
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

acho que onde está o >= 30 você colocaria 30 + o numero de feriados dos ultimos 30 dias, isso né?

que dai viraria um

Selecionar tudo

select *
from suatabela
where (sysdate - seucampo) >= (select count(*) from suatabeladeferiados where dtferiado between add_months(sysdate, -1) and sysdate)
veja aí mano
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

Isso:

Selecionar tudo

select *
from suatabela
where (sysdate - seucampo) >= (30 + (select count(*) from suatabeladeferiados where dtferiado between add_months(sysdate, -1) and sysdate))
Avatar do usuário
jeroqueiroz
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Qui, 18 Fev 2010 2:40 pm
Localização: Salvador - BA
Att,
Jeremias Santos - http://twitter.com/jeroqueiroz
JavaC - Java Community - http://www.javac.com.br
Twitter Fórum JavaC - http://twitter.com/javac_forum

este são os dias que são feriados?

Selecionar tudo

add_months(sysdate, -1) 
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

add = adicionar
months = meses

é uma função do oracle para adicionar ou subtrair meses a uma data,

pois por exemplo fevereiro, tem 28 dias, nesse seu caso acho que até poderia ser direto 30 dias, sem fazer add_months, daí no caso seria o sysdate - 30

Selecionar tudo

dtferiado <= (sysdate - 30)
faz os testes aí e vê se o resultado é o esperado,

;)
Avatar do usuário
jeroqueiroz
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Qui, 18 Fev 2010 2:40 pm
Localização: Salvador - BA
Att,
Jeremias Santos - http://twitter.com/jeroqueiroz
JavaC - Java Community - http://www.javac.com.br
Twitter Fórum JavaC - http://twitter.com/javac_forum

Ao meu entender preciso de tipo uma função que eu informe duas datas dai ele verifique se na tabela possui registros neste intervalo destas datas, dai terei a quantidade desejada.

Sabe se tem algo do tipo?.
diegolenhardt
Moderador
Moderador
Mensagens: 1177
Registrado em: Qui, 15 Out 2009 10:28 am
Localização: Recife

da pra fazer tudo via select, acredito eu,

existe um tipo de objeto: function,

procure por create or replace function ,

nesse caso fica mais flexivel a algum tratamento a mais que queira fazer,
Avatar do usuário
jeroqueiroz
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Qui, 18 Fev 2010 2:40 pm
Localização: Salvador - BA
Att,
Jeremias Santos - http://twitter.com/jeroqueiroz
JavaC - Java Community - http://www.javac.com.br
Twitter Fórum JavaC - http://twitter.com/javac_forum

Acho realmente terá que ser uma function.

Acho que o ideal será ter uma function que recebe uma data e a quantidade de dias e dai retorna a data de vencimento baseando-se nesta data + a quantidade de dias recebido.

Tipo recebe SYSDATE e 30 dias como quantidade, ou seja dai a mesma calcula a partir de hoje qual a data que será 30 dias úteis (sem sabado, domingos e feriados que estará em uma tabela).

Então esta data retornada será a data de vencimento.

Apesar de explicar a necessidade tem varias questões q ainda não tenho certeza de como fazer, até mesmo devido não ter tanto temo de vivencia com o oracle, por isso estou pedido a ajuda do grupo.

Se alguém tive algo do tipo já pronto ou a caminha ou até ideias recursos do oracle que possa ajudar, desde já sou grato.

vlw!
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

Outro meio de se fazer só com SQL (bem gambiarra) é o seguinte:

Criar e popular uma tabela com "todas" as datas possíveis (a partir da menor data cadastrada da sua tabela), e então fazer um MINUS com as datas da sua tabela de feriados...
Com o resultado você pode brincar e adquirir a data de vencimento.

Selecionar tudo

-- Criando tabela:
CREATE TABLE DATAS (
  DATAS_ANO DATE
);

-- Populando aabela:
DECLARE
  DT DATE;
BEGIN
  SELECT TRUNC(MIN(DATA_CADASTRADA)) INTO DT FROM TABELA;
  FOR I IN 1..6000 LOOP
    INSERT INTO T2 VALUES(DT + I);
  END LOOP;
  COMMIT;
END;
E a consulta:

Selecionar tudo

SELECT DTS DATA_VENCIMENTO 
FROM (
  SELECT DTS, ROWNUM RN 
  FROM (
    SELECT DATAS_ANO DTS FROM DATAS
    MINUS
    SELECT TRUNC(DATA_CADASTRADA) FROM TABELA)
  WHERE DTS > TRUNC(TO_DATE('01/01/2010','DD/MM/YYYY')) -- data cadastrada do registro.
  ORDER BY DTS ASC
) WHERE RN = 30;
Seria mais ou menos isso, mas considerando que o campo da tabela de feriados seja um campo DATE...
Avatar do usuário
jeroqueiroz
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Qui, 18 Fev 2010 2:40 pm
Localização: Salvador - BA
Att,
Jeremias Santos - http://twitter.com/jeroqueiroz
JavaC - Java Community - http://www.javac.com.br
Twitter Fórum JavaC - http://twitter.com/javac_forum

To fazendo a seguinte query, sendo que a mesma já esta bem proximo do que preciso, porém estou preso a um valor que esta fico que é o do "conect by <= 30", executando esta query ele traz 15 dias úteis neste perido, porém preciso que de alguma forma que ele verifique até que o resultado seja igual a 30 registros.

Selecionar tudo

select dt, to_char(dt,'d') from
(select trunc(sysdate)+level dt from dual connect by level <= 30) x
where to_char(dt,'d') NOT IN (1,7)
AND DT NOT IN (SELECT FERI_DATA FROM DA_FERIADO)
Alguma dica pra finalizar?..

vlw!
Avatar do usuário
jeroqueiroz
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Qui, 18 Fev 2010 2:40 pm
Localização: Salvador - BA
Att,
Jeremias Santos - http://twitter.com/jeroqueiroz
JavaC - Java Community - http://www.javac.com.br
Twitter Fórum JavaC - http://twitter.com/javac_forum

Desculpas os erros na escrita...a pressa em resolver...

vlw!
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

É mais fácil trazer mais do que 30 registros e depois cortar o resultado, pegando os 30 primeiros...

Tente aumentar o connect by level e depois você seleciona somente o rownum <= 30, ordenando antes pela data...
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

Resumindo o que eu falei na mensagem acima:

Selecionar tudo

select * from (
  select dt, to_char(dt,'d'), rownum rn
  from (
    select trunc(sysdate)+level dt 
    from dual 
    connect by level <= 80) x
  where to_char(dt,'d') NOT IN (1,7)
  order by dt asc)
where rn <= 30;
ou se quiser só trazer a trigésima data utilize rn = 30.
Avatar do usuário
jeroqueiroz
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Qui, 18 Fev 2010 2:40 pm
Localização: Salvador - BA
Att,
Jeremias Santos - http://twitter.com/jeroqueiroz
JavaC - Java Community - http://www.javac.com.br
Twitter Fórum JavaC - http://twitter.com/javac_forum

Vlw ! a todos...
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

Se alguém modificar o NLS_TERRITORY na sessão pode dar bug pois vários países, especialmente europeus, Argentina entre outros vizinhos nossos utilizam a Segunda-feira como o primeiro dia da semana.
Note a execução abaixo:

Selecionar tudo

SQL> alter session set nls_territory = 'ARGENTINA';
 
Session altered
SQL> select dt, to_char(dt, 'DAY')
  2  from (
  3    select dt, to_char(dt,'d'), rownum rn
  4    from (
  5      select trunc(sysdate)+level dt
  6      from dual
  7      connect by level <= 80) x
  8    where to_char(dt,'d') NOT IN (1,7)
  9    order by dt asc)
 10  where rn <= 5;
 
DT          TO_CHAR(DT,'DAY')
----------- -----------------
20/2/2010   SÁBADO
23/2/2010   TERÇA-FEIRA
24/2/2010   QUARTA-FEIRA
25/2/2010   QUINTA-FEIRA
26/2/2010   SEXTA-FEIRA
 
SQL>  


Para evitar acidentes vá pelo nome do dia da semana, que pode ser setado explicitamente no código com o NLS_DATE_LANGUAGE:

Selecionar tudo

SQL> alter session set nls_territory = 'ARGENTINA';
 
Session altered
SQL> select dt, to_char(dt, 'DAY')
  2  from (
  3    select dt, to_char(dt,'DY', 'nls_language=''BRAZILIAN PORTUGUESE'''), rownum rn
  4    from (
  5      select trunc(sysdate)+level dt
  6      from dual
  7      connect by level <= 80) x
  8    where to_char(dt,'DY', 'nls_language=''BRAZILIAN PORTUGUESE''') NOT IN ('SÁB','DOM')
  9    order by dt asc)
 10  where rn <= 5;
 
DT          TO_CHAR(DT,'DAY')
----------- -----------------
22/2/2010   SEGUNDA-FEIRA
23/2/2010   TERÇA-FEIRA
24/2/2010   QUARTA-FEIRA
25/2/2010   QUINTA-FEIRA
26/2/2010   SEXTA-FEIRA
 
SQL> 
Avatar do usuário
jeroqueiroz
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 19
Registrado em: Qui, 18 Fev 2010 2:40 pm
Localização: Salvador - BA
Att,
Jeremias Santos - http://twitter.com/jeroqueiroz
JavaC - Java Community - http://www.javac.com.br
Twitter Fórum JavaC - http://twitter.com/javac_forum

Grande dica...

vlw!!!!!

Muito bom mesmo...
Responder
  • Informação
  • Quem está online

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