小于或等于符号未在Db2数据库中带来期望的结果

时间:2019-05-02 14:39:25

标签: date db2 db2-luw

以下查询在针对DB2数据库执行时不会从2019年3月31日开始引入记录。理想情况下,由于所使用的运算符为<=,因此也应引入这些记录。有行,如果我给出<'2019-04-01',它行得通,但是我们不想使用它,而与<=一起使用。

select wonum, requireddate ,cost 
from workorder 
where reportdate >='2019-03-01'  AND reportdate <= '2019-03-31'

2 个答案:

答案 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是日期时间,则您可能需要考虑将列重命名为例如。 reportdatetimeREPORT_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'