none
Unir duas Views por DateTime RRS feed

  • Pergunta

  • Caros, que por falta de conhecimento não acho solução.

    Tenho uma View A {Tanque, DataHoraInicio, DataHoraFim} em um banco relacional e outra View B {Tanque, DataHora} em um banco Temporal. Quando faço um Join entre as duas views como A.Tanque = B.Tanque ,o select me retorna valores duplicados, pois os campos de datahora não se coincidem (por lógica do processo eles não devem mesmo se coincidir em ambas views). Preciso então verificar quando horário de B.DataHora está entre os horários de A.DataHoraInicio e A.DataHoraFinal  ao mesmo tempo em que A.Tanque = B.Tanque. 

    Fiz pelo Java, fazendo dois selects distintas em cada banco por vez, porém dessa forma eu perco algumas possibilidades que apenas o sql me oferece. Fiz alguns scripts também, porém não funcionou. 

    O resultado que preciso seria mais ou menos esse, nesse exemplo as datas estão coincidindo e não tem problema:

    Se alguém puder me ajudar.

    terça-feira, 29 de agosto de 2017 19:08

Respostas

Todas as Respostas

  • Posta por favor alguns dados de exemplo:

    Wesley Neves

    terça-feira, 29 de agosto de 2017 23:38
  • Exemplo:

    View A

    Tanque           DataHoraInicio                 DataHoraFinal

         10     2017-08-30 00:01:00     2017-08-30 01:05:00

         13     2017-08-30 02:00:00     2017-08-30 03:48:00

    View B

    Tanque           DataHora

         10     2017-08-30 00:45:00

         13     2017-08-30 03:01:00

         15     2017-08-30 04:48:00

    O Resultado Seria:

    A.Tanque    A.DataHoraInicio                 A.DataHoraFinal           B.Tanque         B.DataHora

         10      2017-08-30 00:01:00         2017-08-30 01:05:00           10          2017-08-30 00:45:00

         13     2017-08-30 02:00:00          2017-08-30 03:48:00           13         2017-08-30 03:01:00


    quarta-feira, 30 de agosto de 2017 10:54
  • Vagner,

    Já pensou em utilizar o comando Distinct?


    Pedro Antonio Galvao Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quarta-feira, 30 de agosto de 2017 12:26
  • Predro, utilizei sim. Porém, o que realmente não está dando certo é relacionar o B.DataHora que está entre A.DataHoraInicio e A.DataHoraFinal no qual o A.Tanque = B.Tanque.

    SELECT substring(B.TagName, 11 ,2) as Tanque
          ,B.DateTime
          ,A.Tanque
          ,A.inicial
          ,A.final
      FROM A
             INNER JOIN
              (SELECT DateTime, TagName
              FROM
              B WHERE TagName like 'SelMist_TQ%.Word'  ) B
    
              ON vm.numeroTanque = substring(TagName, 11 ,2)
    
              where inicio between '2017-08-30 00:00:00' and '2017-08-30 23:59:59'    
     and DateTime >= inicial or DateTime <= final

    Repare no resultado do código acima, ele pega o DateTime igual para todas as linhas, quando na verdade ele deveria pegar o DateTime que está entre a Data inicial e final.


    • Editado vagner.gomes quarta-feira, 30 de agosto de 2017 13:22 Adição de imagem
    quarta-feira, 30 de agosto de 2017 13:21
  • Vagner boa tarde,

    Já tentou da forma abaixo?

    SELECT * FROM VW_A AS A

    INNER JOIN VW_B AS B

    ON A.Tanque = B.Tanque AND

    B.DataHora BETWEEN A.DataHoraInicio AND A.DataHoraFinal





    quinta-feira, 31 de agosto de 2017 17:39
  • Exemplo:

    View A

    Tanque           DataHoraInicio                 DataHoraFinal

         10     2017-08-30 00:01:00     2017-08-30 01:05:00

         13     2017-08-30 02:00:00     2017-08-30 03:48:00

    View B

    Tanque           DataHora

         10     2017-08-30 00:45:00

         13     2017-08-30 03:01:00

         15     2017-08-30 04:48:00

    O Resultado Seria:

    A.Tanque    A.DataHoraInicio                 A.DataHoraFinal           B.Tanque         B.DataHora

         10      2017-08-30 00:01:00         2017-08-30 01:05:00           10          2017-08-30 00:45:00

         13     2017-08-30 02:00:00          2017-08-30 03:48:00           13         2017-08-30 03:01:00


    Cara me desculpa se eu não estou conseguindo entender mas de uma olhada nisso

    View A

    Tanque           DataHoraInicio                 DataHoraFinal

         10     2017-08-30 00:01:00     2017-08-30 01:05:00

         13     2017-08-30 02:00:00     2017-08-30 03:48:00

    DECLARE @ViewA TABLE
        (
          Tanque INT ,
          DataHoraInicio DATETIME2 ,
          DataHoraFinal DATETIME2
        );
    INSERT  INTO @ViewA
            ( Tanque, DataHoraInicio, DataHoraFinal )
    VALUES  ( 10, '2017-08-30 00:01:00', '2017-08-30 01:05:00' ),
            ( 13, '2017-08-30 02:00:00', '2017-08-30 03:48:00' );
    


    View B

    Tanque           DataHora

         10     2017-08-30 00:45:00

         13     2017-08-30 03:01:00

         15     2017-08-30 04:48:00

    DECLARE @ViewB TABLE
    (
    Tanque	INT,
    DataHora DATETIME
    
    )
    INSERT INTO @ViewB
            ( Tanque ,
              DataHora
            )
    VALUES  ( 10 , '2017-08-30 00:45:00'),
    		( 13 , '2017-08-30 03:01:00' ),
    		( 15 , '2017-08-30 04:48:00' )
    


    O Resultado Seria:

    A.Tanque    A.DataHoraInicio                 A.DataHoraFinal           B.Tanque         B.DataHora

         10      2017-08-30 00:01:00         2017-08-30 01:05:00           10          2017-08-30 00:45:00

         13     2017-08-30 02:00:00          2017-08-30 03:48:00           13         2017-08-30 03:01:00 

    SELECT VA.Tanque ,
           VA.DataHoraInicio ,
           VA.DataHoraFinal,
    	   VB.Tanque,
    	   VB.DataHora FROM @ViewA AS VA
    	   JOIN @ViewB AS VB ON VB.Tanque = VA.Tanque
    

    Wesley Neves - Brasilia-DF

     
    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"





    Wesley Neves

    quinta-feira, 31 de agosto de 2017 18:47
  • Deleted
    quinta-feira, 31 de agosto de 2017 20:31
  • Deleted
    quinta-feira, 31 de agosto de 2017 21:03
  • Deleted
    quinta-feira, 31 de agosto de 2017 21:04
  • Já fiz isso, mas vou teste com seu código para ver o resultado, assim que puder deixo resposta.
    sexta-feira, 1 de setembro de 2017 13:08
  • José, qual sua dúvida?
    sexta-feira, 1 de setembro de 2017 13:13
  • Obrigado pela resposta, Wesley. Seu caso funciona porque tem apenas dois tanques na sua tabela, acredito eu. Aqui tenho várias informações dessas sendo geradas diáriamente, se for dessa forma os dados se repetem.

    Executei seu código, veja o resultado:


    • Editado vagner.gomes sexta-feira, 1 de setembro de 2017 16:43 Imagem
    sexta-feira, 1 de setembro de 2017 16:42
  • Já tinha feito esse código aqui também, não deu certo, vlw.
    sexta-feira, 1 de setembro de 2017 17:07
  • vc pode postar as seguintes consultas:

    SELECT TO 10 * FROM ViewA 
    ORDER BY NumeroTanque
    
    SELECT TO 10 * FROM ViewB
    ORDER BY NumeroTanque


    Wesley Neves - Brasilia-DF

     
    wesley.si.neves@gmail.com
    MTA-SQL Server
    MTA- Web Development
    Analista Desenvolvedor.NET
    Pós-Graduando em Banco de Dados 
    "Se a resposta for útil ou ajudar ,não esqueça de marcar"





    Wesley Neves

    sexta-feira, 1 de setembro de 2017 17:13
  • Esses são os resultados de hoje:

    sexta-feira, 1 de setembro de 2017 17:59
  • Deleted
    sexta-feira, 1 de setembro de 2017 23:14
  • Deleted
    sábado, 2 de setembro de 2017 19:22
  • Deleted
    sábado, 2 de setembro de 2017 19:33
  • Deleted
    • Marcado como Resposta vagner.gomes terça-feira, 5 de setembro de 2017 11:32
    sábado, 2 de setembro de 2017 19:46