Pular para o conteúdo
Visualizando 8 posts - 1 até 8 (de 8 do total)
  • Autor
    Posts
  • #81425
    juloko666
    Participante

      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 null

      Como 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.

      #81426
      Marcio68Almeida
      Participante

        Nã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.

        #81432
        juloko666
        Participante

          Marcio68Almeida,
          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?

          #81433
          Marcio68Almeida
          Participante

            Entendi…
            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

            #81440
            juloko666
            Participante

              Marcio68Almeida,

              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_FIM

              1 01/02/08 02/02/08
              1 03/02/08 04/02/08

              COMO ESTÁ
              ID(FK) – DT_INI – DT_FIM

              1 01/02/08 02/02/08
              1 02/02/08 04/02/08

              OK??

              #81441
              Marcio68Almeida
              Participante

                o script que fiz é para a mesma tabela…

                #81442
                santosclay
                Participante

                  Segue 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.

                  #81447
                  juloko666
                  Participante

                    Obrigado 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!

                  Visualizando 8 posts - 1 até 8 (de 8 do total)
                  • Você deve fazer login para responder a este tópico.
                  plugins premium WordPress