Запрос последних записей с отдельными полями даты и времени - PullRequest
3 голосов
/ 12 июля 2019

Я работаю с таблицей в SAP Advantage с отдельными полями даты и времени.Я хочу найти записи с датой и временем за последние 5 минут.

Это работает в 99% случаев:

SELECT
    *
FROM
    table_name
WHERE 
    TIMESTAMPDIFF(SQL_TSI_DAY, date_field, CURRENT_TIMESTAMP()) < 1
AND
    TIMESTAMPDIFF(SQL_TSI_MINUTE, time_field, CURRENT_TIMESTAMP()) < 5

Однако это не сработает около полуночи.Например, в 12:00 все записи, созданные в 23:57 предыдущего дня, не будут соответствовать фильтру.

Есть идеи сделать это?Спасибо!

Образец изображения данных.Основываясь на этих данных, я хотел бы вернуть последние 2 строки в 7.12.1919 в 00:01

1011 *enter image description here
Created: 7/11/2019 22:54:43

Item EmpNo      LastName             FirstName       date_field time_field
--------------------------------------------------------------------------
1          2 Nelson               Roberto         7/11/2019  21:00:00  
2          4 Young                Bruce           7/11/2019  22:00:00  
3          5 Lambert              Kim             7/11/2019  23:00:00  
4          8 Johnson              Leslie          7/11/2019  23:56:00  
5          9 Forest               Phil            7/12/2019  00:00:00  

1 Ответ

3 голосов
/ 12 июля 2019

Самый простой способ - это рекомбинировать поля и затем использовать TIMESTAMPDIFF():

TRY DROP TABLE #test; CATCH ALL END TRY;

CREATE TABLE #test
(
    date_field DATE
  , time_field TIME
);

INSERT INTO #test
      SELECT '2019-07-11', '21:00:00' FROM system.iota
UNION SELECT '2019-07-11', '22:00:00' FROM system.iota
UNION SELECT '2019-07-11', '23:00:00' FROM system.iota
UNION SELECT '2019-07-11', '23:56:00' FROM system.iota
UNION SELECT '2019-07-12', '00:00:00' FROM system.iota
;

SELECT
  TIMESTAMPDIFF(SQL_TSI_MINUTE, 
      CREATETIMESTAMP(
          YEAR(date_field)
        , MONTH(date_field)
        , DAY(date_field)
        , HOUR(time_field)
        , MINUTE(time_field)
        , SECOND(time_field)
        , 0
      )
    , DATETIME'2019-07-12T00:00:00' --  CURRENT_TIMESTAMP()
  )
FROM #test;

Что дает ожидаемый результат:

180
120
4
0

Было бы еще более тривиально, если бы ADS поддерживал оператор или функцию для непосредственного объединения даты и времени, но я не могу найти их в документации.

Так что, если вы интегрируете это в исходный код SQL, это будет:

SELECT
    *
FROM
    table_name
WHERE 
  TIMESTAMPDIFF(SQL_TSI_MINUTE, 
      CREATETIMESTAMP(
          YEAR(date_field)
        , MONTH(date_field)
        , DAY(date_field)
        , HOUR(time_field)
        , MINUTE(time_field)
        , SECOND(time_field)
        , 0
      )
    , CURRENT_TIMESTAMP()
  ) < 5
...