Trazer registro de uma tabela onde a data e hora seja a mais próxima da data e hora de outro registros
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
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
Curtidas 0
Respostas
Emerson Nascimento
24/06/2022
pode ser:
ou apenas:
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*)
GOSTEI 0
Juliano Silva
24/06/2022
pode ser:
ou apenas:
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.
GOSTEI 0
Juliano Silva
24/06/2022
Consegui fazer da seguinte forma:
O retorno foi
2021-11-09 17:00:06.000 9389003 1787
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
GOSTEI 0
Emerson Nascimento
24/06/2022
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:
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 )
GOSTEI 0