Меньше или равно символу, не приносящему желаемых результатов в базе данных Db2 - PullRequest
0 голосов
/ 02 мая 2019

Запрос ниже, если он выполняется для базы данных DB2, не приводит к записи с 31 марта 2019 года. В идеале он должен также вводить эти записи, поскольку используемый оператор - <=. Есть строки, и это работает, если я дам <'2019-04-01', однако мы не хотим использовать это и идти с <=.

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

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Если 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'
2 голосов
/ 02 мая 2019

Это работает, как задумано.
'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.
Так что, как упоминал Пол, вы можете использовать reportdate <= '2019-03-31-24.00.00' вместо reportdate <= timestamp('2019-03-31-23.59.59.999999999999', 12).
Обратите внимание, что мы должны указатьдоля дробных секунд (12) явно в последнем случае.В противном случае метка времени преобразуется в метку времени (6) с усечением данных.

...