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!
Data No Oracle
- jeroqueiroz
- 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
Jeremias Santos - http://twitter.com/jeroqueiroz
JavaC - Java Community - http://www.javac.com.br
Twitter Fórum JavaC - http://twitter.com/javac_forum
-
- Moderador
- Mensagens: 1177
- Registrado em: Qui, 15 Out 2009 10:28 am
- Localização: Recife
pode testar direto
aí tem que ver o lance do feriado..
select *
from suatabela
where (sysdate - seucampo) >= 30
- jeroqueiroz
- 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
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.
Realmente agora falta o tratamento do feriado.
Se alguém souber mais algo...
Desde já agradeço.
-
- 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
veja aí mano
que dai viraria um
select *
from suatabela
where (sysdate - seucampo) >= (select count(*) from suatabeladeferiados where dtferiado between add_months(sysdate, -1) and sysdate)
-
- Moderador
- Mensagens: 1177
- Registrado em: Qui, 15 Out 2009 10:28 am
- Localização: Recife
Isso:
select *
from suatabela
where (sysdate - seucampo) >= (30 + (select count(*) from suatabeladeferiados where dtferiado between add_months(sysdate, -1) and sysdate))
- jeroqueiroz
- 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
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?
add_months(sysdate, -1)
-
- 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
faz os testes aí e vê se o resultado é o esperado,
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
dtferiado <= (sysdate - 30)
- jeroqueiroz
- 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
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?.
Sabe se tem algo do tipo?.
-
- 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,
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,
- jeroqueiroz
- 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
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!
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!
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.
E a consulta:
Seria mais ou menos isso, mas considerando que o campo da tabela de feriados seja um campo DATE...
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.
-- 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;
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;
- jeroqueiroz
- 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
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.
Alguma dica pra finalizar?..
vlw!
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)
vlw!
- jeroqueiroz
- 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
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!
vlw!
É 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...
Tente aumentar o connect by level e depois você seleciona somente o rownum <= 30, ordenando antes pela data...
Resumindo o que eu falei na mensagem acima:
ou se quiser só trazer a trigésima data utilize rn = 30.
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;
- jeroqueiroz
- 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
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...
- 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
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:
Para evitar acidentes vá pelo nome do dia da semana, que pode ser setado explicitamente no código com o NLS_DATE_LANGUAGE:
Note a execução abaixo:
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:
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>
- jeroqueiroz
- 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
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...
vlw!!!!!
Muito bom mesmo...
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 7 visitantes