- Este tópico contém 7 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 10 meses atrás por juloko666.
-
AutorPosts
-
14 de março de 2008 às 11:45 pm #81425juloko666Participante
Tenho uma tabela que, entre outros campos, contem a data incio e fim de um determinado evento.
Varios registros são inseridos pela aplicação de forma que eles não encavelem, como no exemplo a seguir:
Dt Inicio – Dt.Fim
1- 01/02/07 02/02/07
2- 03/02/07 nullComo eu faço pra comparar a data fim do 1º com a data incio do 2º sem usar procedures e afins(algo que vc armazene em variaveis)?
Ja fiz inner join da tabela com ela mesmo, mas não funcionou.
15 de março de 2008 às 12:10 am #81426Marcio68AlmeidaParticipanteNão entendi o que você quer fazer…
Quer fazer algum relatório de cronograma, por exemplo, ou quer evitar que as datas se encavalem ???
Caso queira que as datas não se encavalem, basta colocar uma trigger consultando a maior data fim, se a nova data de início form menor não aceitar.17 de março de 2008 às 3:41 pm #81432juloko666ParticipanteMarcio68Almeida,
quero fazer uma consulta (query) para saber se há datas encavaladas.O tratamento de desta regra de não encavalar é, teoricamente, feito por uma outra rotina na aplicação.
Entendido?
17 de março de 2008 às 3:53 pm #81433Marcio68AlmeidaParticipanteEntendi…
Você pode fazer o seguinte :
Select a.*
from tabela a, tabela b
Where a.dt_inic between b.dt_inic and b.dt_fim
or a.dt_fim between b.dt_inic and b.dt_fim
17 de março de 2008 às 6:24 pm #81440juloko666ParticipanteMarcio68Almeida,
isso seria resolvido se fossem tabelas diferentes….mas é uma mesma tabela onde, os registros são inseridos e pra uma determinado id, as datas não podem encavalar como no EXEMPLO
TABELA X
COMO DEVERIA SER
ID(FK) – DT_INI – DT_FIM1 01/02/08 02/02/08
1 03/02/08 04/02/08COMO ESTÁ
ID(FK) – DT_INI – DT_FIM1 01/02/08 02/02/08
1 02/02/08 04/02/08OK??
17 de março de 2008 às 6:54 pm #81441Marcio68AlmeidaParticipanteo script que fiz é para a mesma tabela…
17 de março de 2008 às 8:20 pm #81442santosclayParticipanteSegue minha sugestão.
--ESTRURA DA TABELA_X--TABELA_X.ID_PK NUMBER
--TABELA_X.DT_INI DATE
--TABELA_X.DT-FIM DATE-- Separar os dados com as datas do campo "DT_INI" e as chaves de indentificação
-- utilizando o comando with alocando o resultado no result virtual
-- chamado "DATAS_INICIAIS".
WITH DATAS_INICIAIS AS (
SELECT TABELA_X.ID_PK AS "CHAVE_PRIMARIA_DO_REGISTRO",
TABELA_X.DT_INI AS "DT_INI"
FROM TABELA_X TABELA_X
WHERE TABELA_X.DT_INI >= TO_DATE('01/03/2008', 'DD/MM/YYYY')
)-- Apos separar os dados realizar o join com o result "DATAS_INICIAIS" apontando para os identificadores.
-- Note que a clausula where é mesma utilizada no comando With, porém foi adicionado a comparadação
-- entre o campo "DT_INI" e "DT_FIM".
-- Se o count der maior que 0 existe algun problema.
SELECT COUNT(*)
FROM TABELA_X
INNER JOIN DATAS_INICIAIS DATAS_INICIAIS AS (DATAS_INICIAIS.CHAVE_PRIMARIA_DO_REGISTRO = TABELA_X.CHAVE_PRIMARIA_DO_REGISTRO)
WHERE TABELA_X.DT_INI >= TO_DATE('01/03/2008', 'DD/MM/YYYY') AND
DATAS_INICIAIS.DATA_APURACAO = TABELA_X.DT_FIM;
-- P.S. verifique o custo antes de rodar a mesma, existe a possibilidade de se criar algum indice para
-- auxiliar processamento.
Abraços e qualquer problema é só entrar em contato.
Clayton.
18 de março de 2008 às 3:40 pm #81447juloko666ParticipanteObrigado pela ajuda!
Consegui obter o resultado que queria.
Existe mais de uma forma de fazer isso(como foi feito demonstrado), mas o exemplo do Marcio68Almeida já me ajudou.
Grato!
-
AutorPosts
- Você deve fazer login para responder a este tópico.