以下查询在针对DB2数据库执行时不会从2019年3月31日开始引入记录。理想情况下,由于所使用的运算符为<=
,因此也应引入这些记录。有行,如果我给出<'2019-04-01'
,它行得通,但是我们不想使用它,而与<=
一起使用。
select wonum, requireddate ,cost
from workorder
where reportdate >='2019-03-01' AND reportdate <= '2019-03-31'
答案 0 :(得分:2)
按设计工作。
'2019-03-31' == timestamp('2019-03-31-00.00.00')
如果您真的不想使用<
(您的组织中是否禁止使用<
符号?:)),请尝试以下操作:
reportdate <= timestamp('2019-03-31-23.59.59.999999999999', 12)
顺便说一句,Db2中有一个有趣的时间戳记:
with t(row, ts) as (values
(1, timestamp('2019-03-31-23.59.59.999999999999', 12))
, (2, timestamp('2019-04-01-00.00.00', 12) - 0.000000000001 second)
, (3, timestamp('2019-03-31-24.00.00', 12))
, (4, timestamp('2019-03-31-23.59.59.999999999999', 12) + 0.000000000001 second)
, (5, timestamp('2019-04-01-00.00.00', 12))
)
select row, ts, dense_rank() over (order by ts) order
from t;
ROW TS ORDER
----------- -------------------------------- --------------------
1 2019-03-31-23.59.59.999999999999 1
2 2019-03-31-23.59.59.999999999999 1
3 2019-03-31-24.00.00.000000000000 2
4 2019-04-01-00.00.00.000000000000 3
5 2019-04-01-00.00.00.000000000000 3
2019-03-31-24.00.00
是一个“特殊”时间戳(带有24:00:00
时间部分)。
它大于任何2019-03-31-xx
时间戳,但小于2019-04-01-00.00.00
。
因此,正如Paul所提到的,您可以使用reportdate <= '2019-03-31-24.00.00'
代替reportdate <= timestamp('2019-03-31-23.59.59.999999999999', 12)
。
注意,在最新情况下,我们必须明确指定小数秒长度(12)。否则,时间戳将转换为timestamp(6),否则数据将被截断。
答案 1 :(得分:2)
如果reportdate
是日期时间,则您可能需要考虑将列重命名为例如。 reportdatetime
或REPORT_DATETIME
,但这是您的数据库设计。
无论如何,您可以这样做
select wonum, requireddate ,cost from workorder
where DATE(reportdate) >='2019-03-01' AND DATE(reportdate) <= '2019-03-31'
或
select wonum, requireddate ,cost from workorder
where DATE(reportdate) BETWEEN '2019-03-01' AND '2019-03-31'
或
select wonum, requireddate ,cost from workorder
where reportdate >='2019-03-01' AND reportdate <= '2019-03-31-24.00.00'