使用单独的日期和时间字段查询最近的记录
Query recent records with separate date and time fields
我正在使用 SAP Advantage 中的 table,其中包含单独的日期和时间字段。我想查找日期和时间在最近 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:00AM,前一天在 11:57PM 创建的任何记录都不会匹配过滤器。
有什么想法吗?谢谢!
数据示例图像。根据此数据,在 2019 年 7 月 12 日 12:01AM,我想 return 最后 2 行。
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
最简单的方法是重新组合字段,然后使用 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
我正在使用 SAP Advantage 中的 table,其中包含单独的日期和时间字段。我想查找日期和时间在最近 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:00AM,前一天在 11:57PM 创建的任何记录都不会匹配过滤器。
有什么想法吗?谢谢!
数据示例图像。根据此数据,在 2019 年 7 月 12 日 12:01AM,我想 return 最后 2 行。
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
最简单的方法是重新组合字段,然后使用 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