Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

vagner.gomes

Join através de DateTime

Recommended Posts

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.

 

Código:

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

 

Se alguém puder me ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, não sei se entendi direito tua dúvida, mas você precisa selecionar os valores onde as datas/horarios da tabela B estão entre os valores Inicial e Final da tabela A, certo?

 

Eu fiz isso e aqui deu certo (no caso apenas os valores de B até Maio estão sendo selecionados:  

 

CREATE TABLE ##tableA (
  ID int IDENTITY(1,1),
  Tanque varchar(255) NOT NULL,
  Inicial Datetime,
  Final Datetime
);

CREATE TABLE ##tableB (
	ID int IDENTITY(1,1),
    Tanque varchar(255) NOT NULL,
    Dia Datetime
);

	Insert into ##tableA (tanque, Inicial, Final) values ('Tanque A', '2017-01-01', '2017-01-31')
	Insert into ##tableA (tanque, Inicial, Final) values ('Tanque A', '2017-02-01', '2017-02-28')
	Insert into ##tableA (tanque, Inicial, Final) values ('Tanque A', '2017-03-01', '2017-03-31')
	Insert into ##tableA (tanque, Inicial, Final) values ('Tanque A', '2017-04-01', '2017-04-30')
	Insert into ##tableA (tanque, Inicial, Final) values ('Tanque A', '2017-05-01', '2017-05-31')

	Insert into ##tableB (tanque, Dia ) values ('Tanque B 0', '2017-01-10')
	Insert into ##tableB (tanque, Dia ) values ('Tanque B 1', '2017-02-10')
	Insert into ##tableB (tanque, Dia ) values ('Tanque B 2', '2017-03-10')
	Insert into ##tableB (tanque, Dia ) values ('Tanque B 3', '2017-04-10')
	Insert into ##tableB (tanque, Dia ) values ('Tanque B 4', '2017-05-10')
	Insert into ##tableB (tanque, Dia ) values ('Tanque B 5', '2017-06-10')
	Insert into ##tableB (tanque, Dia ) values ('Tanque B 6', '2017-07-10')
	Insert into ##tableB (tanque, Dia ) values ('Tanque B 7', '2017-08-10')
	Insert into ##tableB (tanque, Dia ) values ('Tanque B 8', '2017-09-10')
    
    
    SELECT B.Tanque
      ,B.Dia
      ,A.Tanque
      ,A.inicial
      ,A.final
FROM ##tableA A
INNER JOIN ##tableB B ON B.Id = A.Id
Where B.Dia between A.Inicial and A.Final

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por mamotinho
      Olá, estou a um tempo tentando acrescentar um codigo na coluna do SQL na qual seria VARBINARY

      A Coluna atual contém o seguinte codigo binary:
      Código (01)
      0x020009004C0101434D0101465C0101485D0101499801014B8401014E8501014F86010150D00009017A0014247D0014257B0014261600090201000903F9001420FA0014229F000923F8001427DF000128730014297600142A7E00142BFB00142CA3010147E000142DE100142EA40101443900120424001405C40101457400142F770014307F0001317C001232E6000421780001332C010A522F0108533A010354380103553001085637010357A5010166A6010167  
      No codigo acima eu gostaria de acrescentar o seguinte codigo:
      Código (02)
      0xCC010120CD010121CE010122CF010123
      no caso eu quero criar uma procedure que ao executar a função ele adicione o codigo 02 no código 01. no caso o codigo ficaria desta forma:

      0x020009004C0101434D0101465C0101485D0101499801014B8401014E8501014F86010150D00009017A0014247D0014257B0014261600090201000903F9001420FA0014229F000923F8001427DF000128730014297600142A7E00142BFB00142CA3010147E000142DE100142EA40101443900120424001405C40101457400142F770014307F0001317C001232E6000421780001332C010A522F0108533A010354380103553001085637010357A5010166A6010167CC010120CD010121CE010122CF010123



      Ficarei imensamente grato se alguém conseguir me ajudar, o orientar. sou iniciante nessa areá ainda.
    • Por tanaka_
      Gostaria de saber se é possível listar todos os objetos criados no banco de dados por usuário especifico.
      Não é para listar os "dbo" e sim o usuário logado que criou o objeto.
       
      Usuário logado:
      select SYSTEM_USER
       
      Todos os objetos criados:
      select * from sys.all_objects
    • Por tanaka_
      Gostaria de saber se é possível listar todos os objetos criados no banco de dados por usuário especifico.
      Não é para listar os "dbo" e sim o usuário logado que criou o objeto.
       
      Usuário logado:
      select SYSTEM_USER
       
      Todos os objetos criados:
      select * from sys.all_objects
    • Por carlos melo
      Boa noite, trabalho com Delphi e estou tendo dificuldade em fazer conexão com meu servidor que esta na argentina, uso o firedac para fazer a conexão com o banco, so que o comando que estou utilizando esta dando erro e não sei se estou configurando certo a minha query.
       
      Ja criei os linked server e tambem não resolveu......
       
       uso um select dentro do delphi dessa maneira : 
      DELPHI
      FDQuery e dentro uso esse select
      Select * from [192.168.XX.XXX].banco.dbo.tabela direcionando para o meu servidor que esta na argentina sendo 192.168.xx.xxx o ip do servidor de la e o nome do banco é servicos e a tabela ordens.
       
      Se alguem conhece ou ja fez esse tipo de conexão , estou precisando dessa grande ajuda...
       
      obrigado
    • Por Robson Barros da Rocha
      Bom dia povo. Tenho um problema, e não uma dúvida. Eu executo no SQL Server esta query para agrupar os resultados cujo tenha o código do comprovante repetido:
      SELECT * FROM SHOP_Pedidos WHERE show='1' GROUP BY comprovante As colunas são:
      ID = Se preenche automaticamente
      comprovante = Recebe o código do comprovante
      productName = Nome do produto
      productValue = Valor do produto
      dateSent = Data que o produto foi enviado
      show = Enviado (1) e não enviado (0)
       
      A query que mostrei acima, não retorna dados porque aparece esse erro: "Column 'SHOP_Pedidos.id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause." Certo, então aí que está o problema. Vendo o erro, eu troquei a * pela coluna comprovante, e resultou, mas a consulta só retorna a coluna comprovante (por conta do SELECT estar especificando somente ele. 
       
      A dúvida é: Tem como recuperar todos as colunas, assim como mysql?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.