【问题标题】:Query recent records with separate date and time fields使用单独的日期和时间字段查询最近的记录
【发布时间】:2019-07-12 01:56:39
【问题描述】:

我正在使用 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,前一天晚上 11:57 创建的任何记录都不会匹配过滤器。

有什么想法吗?谢谢!

数据的示例图像。根据这些数据,在 2019 年 7 月 12 日凌晨 12:01,我想返回最后 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  

【问题讨论】:

  • TIMESTAMP 字段同时包含日期和时间。如果您不将它们分开,则不会存在此问题,因为针对当前时间戳的简单TIMESTAMPDIFF 可以满足您的要求。你把这变成了一项相当复杂的任务。日期和时间列最初是如何存储的? (各个值的来源,以及它们是如何写入数据库的?)您能否edit 提供示例数据以及您希望从该数据中获得的输出?
  • 我没有创建表。它们是由第 3 方系统填充的“日期”和“时间”字段。
  • 好的。同样,您能否提供示例数据以及您希望从该数据中获得的输出?
  • 已编辑。谢谢。
  • 我无法使用图像中的数据。我无法将其复制/粘贴到 ARC32 中并使用 CREATE TABLE 和 INSERT 从中创建表。右键单击列标题,选择导出为文本格式并将其显示在屏幕上,然后将包含列标题的数据复制/粘贴到您的帖子中。

标签: sql sap advantage-database-server


【解决方案1】:

最简单的方法是重新组合字段,然后使用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

【讨论】:

  • 这就是我睡觉得到的。有人偷走了我对解决方案的想法。 :-) 这就是我认为应该这样做的方式。 +1。
猜你喜欢
  • 1970-01-01
  • 2017-10-02
  • 2019-08-26
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 2018-02-10
  • 2014-03-05
  • 1970-01-01
相关资源
最近更新 更多