Como achar uma data q não está gravada no banco?

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Martelus
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Sex, 18 Abr 2008 10:50 am
Localização: muito

Por ex: eu tenho 2 campos datas(inicial e final) onde é rodado um servico que grava nessas 2 campos. E eu preciso fazer uma consulta q informando um intervalo (inicio e fim) traga os meses estao faltando nesses campos.
gokden
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 264
Registrado em: Dom, 19 Ago 2007 8:18 pm
Localização: Ribeirão Preto - SP
Lucas de Souza

OCA Developer
Analista de sistemas

não intendo muito bem o seu problema... mais já tentou usar o months_between ??

ex:

Selecionar tudo

select months_between(to_date('12/12/2008', 'dd/mm/yyyy'), to_date('12/01/2008', 'dd/mm/yyyy')) 
  from dual
/
Avatar do usuário
jessica.ff
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 61
Registrado em: Seg, 11 Jun 2007 2:28 pm
Localização: Gravataí - RS
ninguém é tão sabio que não tenha a aprender, e nem tão ignorante que não tenha a ensinar.

Podes nos explicar melhor :?:

Tb não consegui entender :roll:
Trevisolli
Moderador
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

Bom dia brothers!

Bom, pelo que eu entendi, que nosso amigo necessita é o seguinte:

Supondo como exemplo a tabela EMP, campo Hiredate.

Ele quer saber que mês não está cadastrado nesta coluna. Por exemplo, saber as admissões que estão faltantes nos valores existentes.

Porém, no caso, não só em uma coluna, mas, na inicial e final, correto?

Se for isso, talvez tenha que montar algo dinâmico.
Martelus
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Sex, 18 Abr 2008 10:50 am
Localização: muito

Hehe, nem eu entendi direito. O sistema na hora de grava a operacao no banco, ele grava nas data inicial e final o mês referente à operacao, Tipo: operacao tal referente ao mês fevereiro(01/02/2008 a 28/02/2008). então eu tenho q procura nesses dois campos os meses q não tem, entenderam? Tipo: não tem informacao referente ao mês 5 nesses campos. O ex q o amigo coloco ali em cima parece funcionar, mas qd eu usei ele não trouxe as datas certas, trouxe tudo. Uma duvida: Como ele vai saber qual campo serao esses month_between? Pelo tipo date das tabelas data inicial e final?
gokden
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 264
Registrado em: Dom, 19 Ago 2007 8:18 pm
Localização: Ribeirão Preto - SP
Lucas de Souza

OCA Developer
Analista de sistemas

aquele months_between(dt_final, dt_inicial) ele retorna quantos meses estão entre as duas datas...
no exmplo acima... ele irá retornar 11 =D
Martelus
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Sex, 18 Abr 2008 10:50 am
Localização: muito

F*deu... :?
marcio.adao
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 53
Registrado em: Sex, 18 Mai 2007 11:52 am
Localização: Descalvado

E ai, Martelus, beleza?

Se a sua consulta precisa ser como eu imagino, você poderia usar o "not between".

Ex.:

Select *
From sua_tabela
Where coluna_de_data not between data_inicial and data_final

Veja se ajuda.

Abraço :!:
Martelus
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Sex, 18 Abr 2008 10:50 am
Localização: muito

Pow Marcio vlw pela ajuda cara, mas nesse caso vai traze as datas q estao gravadas na tabela mas q não esteja no intervalo q eu passei. Vou tentar explicar melhor:

Foi gravado durante 2007 as seguintes datas:

Selecionar tudo

Data Inicial             Data Final
01/01                     30/01
01/02                     28/02
01/03                     30/03

01/05                     30/05   
01/06                     31/06

01/08                     31/08
01/09                     30/09
...continua ate dezembro

Eu preciso fazer uma consuta q traga os meses: 4 e 7. não tem nenhum registro referente a esses dois meses. Entenderam?
marcio.adao
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 53
Registrado em: Sex, 18 Mai 2007 11:52 am
Localização: Descalvado

Ah está! agora entendi o seu problema...

Pelo que percebi a data inicial sempre será o 1º dia do mês. Então você nem precisará da data final. Tentei fazer aqui usando uma tabela auxiliar(user_tables) para retornar todos os meses do período e fiz um Minus para retornar a diferença com a sua. Dá uma "oiada":

Selecionar tudo

select add_months(trunc( TO_DATE('01/2008','MM/YYYY')  ,'mm'),rownum-1) 
from user_tables 
where rownum <= months_between ( to_date('12/2008','mm/yyyy'),
to_date('01/2008','mm/yyyy')) + 1 
minus
select data_inicial from sua_tabela
where data_inicial between '01/01/2008' and '01/12/2008'
Qualquer coisa, manda ai.

[]s!
Martelus
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Sex, 18 Abr 2008 10:50 am
Localização: muito

Estranho, não trouxe nada a consulta. Essas datas estao certas, na linha 3 e 4 tem um between onde a primeira data é maior q a segunda, não teria q ser ao contrario?
marcio.adao
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 53
Registrado em: Sex, 18 Mai 2007 11:52 am
Localização: Descalvado

A sintaxe do months_between é assim mesmo. Aqui funcionou certinho. será a data_incial da sua tabela não está com a hora? se estiver, dê um trunc na data_inicial no último where.

Abraço!
marcio.adao
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 53
Registrado em: Sex, 18 Mai 2007 11:52 am
Localização: Descalvado

Faz assim:

Selecionar tudo

select add_months(trunc( TO_DATE('01/2008','MM/YYYY') ,'mm'),rownum-1) 
from user_tables 
where rownum <= months_between ( to_date('12/2008','mm/yyyy'), 
to_date('01/2008','mm/yyyy')) + 1 
minus 
select trunc(data_inicial) from sua_tabela 
where trunc(data_inicial) between '01/01/2008' and '01/12/2008'
Martelus
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Sex, 18 Abr 2008 10:50 am
Localização: muito

Cara, não é o problema do trunc na data não, ela não tem hora. E se fosse daria erro não? Ele executa, mas não traz nada. :( To vendo q vo te q fazer em java mesmo.
marcio.adao
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 53
Registrado em: Sex, 18 Mai 2007 11:52 am
Localização: Descalvado

Então o problema pode estar na tabela user_tables. Rode apenas a 1ª consulta. Se não retornar nada, substitua esta tabela por alguma outra que você tenha aí q possua pelo menos 12 registros.
Martelus
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Sex, 18 Abr 2008 10:50 am
Localização: muito

Cara, pelo q eu vi com o pessoal do bd daqui, não tem como usar uma tabela temporaria pra guardar a informacao, a gente usa oracle+ pl/sql
marcio.adao
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 53
Registrado em: Sex, 18 Mai 2007 11:52 am
Localização: Descalvado

Bom dia, Martelus. Nesse caso, não é uma tabela temporária. Eu usei uma tabela qualquer que tenha pelo menos 12 registros. É só pra usar o rownum da tabela...
Martelus
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Sex, 18 Abr 2008 10:50 am
Localização: muito

hehe, vlw marcio pela ajuda. Mas acabei fazendo em java mesmo. Fico uma consulta simples pesquisando um mês/ano. Ai no java eu pego o intervalo q eu quero e mando procura cada mês, se não traz nada quer dizer q aquele mês está omisso.
Responder
  • Informação
  • Quem está online

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