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

24/06/2022

0

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:
1
2
3
4
5
6
7
8
9
10
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:
1
2
3
4
5
6
7
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

Gostei + 0

24/06/2022

Juliano Silva

pode ser:
1
2
3
4
5
6
7
8
9
10
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:
1
2
3
4
5
6
7
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*)

Ler Mais...



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

Gostei + 0

24/06/2022

Juliano Silva

Consegui fazer da seguinte forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

Gostei + 0

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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

Gostei + 0

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

Aceitar