Trazer registro de uma tabela onde a data e hora seja a mais próxima da data e hora de outro registros

24/06/2022

8

Pessoal,

tenho uma situação aqui em que uma integração ficará gerando registros em uma tabela. Essa integração vai registrar Data / Hora, Hodomedro do veículo, Placa do veículo.

Com base na informação de uma outra tabela, que também vai conter uma Data e Hora, preciso trazer, o registro dessa outra tabela, onde a data e a hora forem próximas.

Exemplo:

Tabela A:
Registros:
DATA KM PLACA
2022-06-24 14:00:06.000 9389003 QJQ7986
2022-06-24 14:40:01.000 9389010 QJQ7986
2022-06-24 15:10:02.000 9389020 QJQ7986

Tabela B:
Registros:
DATA PLACA KM
2022-06-24 14:43:06.000 QJQ7986 ????



Na tabela B, preciso consultar a Tabela A para trazer o KM, porém, precisa ser o KM da Data e Hora mais próxima da tabela B. Nesse exemplo, deste registro da Tabela B, precisaríamos retornar o registro "2022-06-24 14:40:01.000 9389010 QJQ7986"

Meu banco de dados é SQLSERVER
Juliano Silva

Juliano Silva

Responder

Posts

24/06/2022

Emerson Nascimento

pode ser:
SELECT
   A.DATA, A.KM, A.PLACA
FROM
   TABELA_A A
INNER JOIN
   TABELA_B B ON B.PLACA = A.PLACA
WHERE
   [B.PLACA = *PLACADESEJADA* AND]
   [B.DATA = *DATADESEJADA* AND]
   A.DATA = (SELECT MAX(A2.DATA) FROM TABELA_A A2 WHERE A2.PLACA = B.PLACA AND A2.DATA <= B.DATA)

ou apenas:
SELECT
   A.DATA, A.KM, A.PLACA
FROM
   TABELA_A A
WHERE
   A.PLACA = *PLACADESEJADA*
   AND A.DATA = (SELECT MAX(A2.DATA) FROM TABELA_A A2 WHERE A2.PLACA = A.PLACA AND A2.DATA <= *DATADESEJADA*)
Responder

24/06/2022

Juliano Silva

pode ser:
SELECT
   A.DATA, A.KM, A.PLACA
FROM
   TABELA_A A
INNER JOIN
   TABELA_B B ON B.PLACA = A.PLACA
WHERE
   [B.PLACA = *PLACADESEJADA* AND]
   [B.DATA = *DATADESEJADA* AND]
   A.DATA = (SELECT MAX(A2.DATA) FROM TABELA_A A2 WHERE A2.PLACA = B.PLACA AND A2.DATA <= B.DATA)

ou apenas:
SELECT
   A.DATA, A.KM, A.PLACA
FROM
   TABELA_A A
WHERE
   A.PLACA = *PLACADESEJADA*
   AND A.DATA = (SELECT MAX(A2.DATA) FROM TABELA_A A2 WHERE A2.PLACA = A.PLACA AND A2.DATA <= *DATADESEJADA*)


Certo, mas desse formato, se o horario do registro da Tabela B fosse 15:00, ele continuaria trazendo "2022-06-24 14:40:01.000 9389010 QJQ7986", ao invés de trazer "2022-06-24 15:10:02.000 9389020 QJQ7986" que seria o horario mais proximo neste caso.
Responder

24/06/2022

Juliano Silva

Consegui fazer da seguinte forma:

 DECLARE @DATA AS DATETIME;
 SET @DATA = '2021-11-09 17:20:00';

SELECT
   A.DATA, A.CODIGOREFERENCIA, A.VEICULO
FROM
   MF_EVENTOVEICULO A
WHERE
   A.VEICULO = 1787
   AND A.DATA = 
   CASE WHEN DATEDIFF(SECOND, (SELECT MAX(A2.DATA) FROM MF_EVENTOVEICULO A2 WHERE A2.VEICULO = A.VEICULO AND A2.DATA <= @DATA), @DATA) <
             DATEDIFF(SECOND, (SELECT MIN(A2.DATA) FROM MF_EVENTOVEICULO A2 WHERE A2.VEICULO = A.VEICULO AND A2.DATA >= @DATA), @DATA)*-1
	    THEN (SELECT MAX(A2.DATA) FROM MF_EVENTOVEICULO A2 WHERE A2.VEICULO = A.VEICULO AND A2.DATA <= @DATA)
		ELSE (SELECT MIN(A2.DATA) FROM MF_EVENTOVEICULO A2 WHERE A2.VEICULO = A.VEICULO AND A2.DATA >= @DATA) END


O retorno foi

2021-11-09 17:00:06.000 9389003 1787
Responder

27/06/2022

Emerson Nascimento

5 pesquisas na mesma tabela? não ficou lento ou gerando muita leitura no banco de dados?
veja se a instrução abaixo executa com performance melhor, visto que há apenas 2 consultas à tabela:
DECLARE @DATA DATETIME = '2021-11-09 17:20:00'
DECLARE @VEICULO INT = 1787
 
SELECT
   A.DATA, A.CODIGOREFERENCIA, A.VEICULO
FROM
   MF_EVENTOVEICULO A
WHERE
   A.VEICULO = @VEICULO
   AND A.DATA = (
					SELECT
						(CASE WHEN COALESCE(DIFANTERIOR,9999999999) < COALESCE(DIFPOSTERIOR,9999999999) THEN ANTERIOR ELSE POSTERIOR END) DATAMAISPROXIMA
					FROM
						(SELECT
							MAX(CASE WHEN DATA <= @DATA THEN DATA ELSE NULL END) ANTERIOR,
							DATEDIFF(SECOND, MAX(CASE WHEN DATA <= @DATA THEN DATA ELSE NULL END), @DATA) DIFANTERIOR,
							MIN(CASE WHEN DATA >= @DATA THEN DATA ELSE NULL END) POSTERIOR,
							DATEDIFF(SECOND, @DATA, MIN(CASE WHEN F2_EMISSAO >= @DATA THEN DATA ELSE NULL END)) DIFPOSTERIOR
						FROM 
							MF_EVENTOVEICULO
						WHERE
							VEICULO = @VEICULO
						) TAB
				)
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários,
consulte nossa política de privacidade.

Aceitar