时间戳更新DB2 SQL

ljsrvy3e  于 2023-01-20  发布在  DB2
关注(0)|答案(2)|浏览(334)

我希望更新自特定日期和时间起24小时内的记录查询。当前查询工作正常,但我需要手动更新两个时间戳。我希望将时间戳数量减少为一个或将其替换为动态表达式,以便尽可能减少人为错误。
当前查询如下所示:

SELECT timestamp 
FROM table
WHERE timestamp BETWEEN '2023-01-18-06.00.00.000000' AND '2023-01-19-06.00.00.000000'

我一直在尝试多个推荐的选项,但它还不起作用:

WHERE timestamp > '2023-01-19-06.00.00.000000' - 24 HOURS
WHERE timestamp > '2023-01-19-06.00.00.000000' – ‘24 HOURS’
WHERE timestamp ('2023-01-19-06.00.00.000000' - 24 HOURS)
WHERE timestamp > '2023-01-19-06.00.00.000000' - '24.00.00.000000'
WHERE timestamp BETWEEN '2023-01-04-06.00.00.000000' AND INTERVAL - 24 HOURS
WHERE timestamp > CURRENT DATE - 24 HOURS
WHERE timestamp ('2023-01-19' - 1 DAY, ('06.00.00.000000' - 24 HOURS))

谁能告诉我我做错了什么?

juzqafwq

juzqafwq1#

'2023-01-19-06.00.00.000000' - 24 HOURS很接近,但不正确,因为DB2不会将第一个值视为时间戳,而是视为字符串,即使它在工作查询中进行了自动转换。因此,您必须做的是告诉它是时间戳,因为您添加了持续时间
使用timestamp关键字

WHERE yourtimestamp > timestamp '2023-01-19-06.00.00.000000' - 24 HOURS

timestamp函数

WHERE yourtimestamp > timestamp('2023-01-19-06.00.00.000000') - 24 HOURS

或者这个符号

WHERE yourtimestamp > '2023-01-19-06.00.00.000000'::timestamp - 24 HOURS

如果您没有使用DB2 LUW或更早版本,则可能有一个或多个选项不可用
我建议你试试这样的

SELECT timestamp 
FROM table cross join (values timestamp '2023-01-19-06.00.00.000000') as ref (stamp)
WHERE timestamp between ref.stamp - 24 hours and ref.stamp
pprl5pva

pprl5pva2#

在过去24小时内,如您的示例所示
WHERE timestamp > CURRENT DATE - 24 HOURS
您可能希望使用CURRENT TIMESTAMP,而不是CURRENT DATE
对于特定的时间段,您总是需要在WHERE子句中指定两个日期,如下所示
WHERE timestamp BETWEEN startTs AND endTs
对于从给定的开始时间戳开始的特定24小时期间,您可以执行如下操作:
WHERE timestamp BETWEEN startTs AND startTs + 24 hours
您可以将startTs定义为全局变量,并在select中使用它

create variable startTs timestamp default('2023-01-18 06:00:00.000');

SELECT timestamp 
FROM table
WHERE timestamp BETWEEN startTs AND startTs + 24 hours;

或者您可以使用表值构造函数来存储它以供...

WITH tmp (startTime) AS (
    VALUES (timestamp('2023-01-19 06:00:00.000'))
) 
select timestamp from table
where timestamp between (select startTime from tmp limit 1) 
                   and (select startTime + 2 hours from tmp limit 1);

根据您的用例,将语句封装为存储过程或用户定义的表函数(UUTF)可能是值得的...

相关问题