我的表中有一个名为DUEDATE
的列名为table1,它是格式为CCYYMMDD
的日期(这是一个db2数据库)。
我想在X天内检索DUEDATE
条记录"" ANYGIVENDATE
的{{1}},例如在ANYGIVENDATE
的3天内,可能意味着DUEDATE
之前和之后3天匹配日期的所有ANYGIVENDATE
条记录。
虽然我可以提供CCYYMMDD
参数,但我很难撰写查询。
我猜我需要检索记录
WHERE [DUEDATE] = [ANYGIVENDATE ± X DAYS]
(CCYYMMDD
格式)?
答案 0 :(得分:0)
您需要将DATE与DATE进行比较,因此需要转换数据库列和输入参数。
或者更好的是,您应该将DATE parm值传递给存储过程并消除该值的转换。
或者将其作为DATE传递,减去/添加X DAYS,然后将这些结果日期值转换为DECIMAL或NUMERIC,并使用它们与数据库值进行比较。鉴于数据库列的定义不正确,这可能是最好的选择。
"within X days"
的含义并不完全清楚。
答案 1 :(得分:0)
如果您将DUEDATE
存储为正确的DATE
数据类型,则查询将只是
...where DUEDATE between ANYGIVENDATE - X days and ANYGIVENDATE + X days
实际上,您可以将值转换为DATE
数据类型,例如:
...where date(timestamp_format(varchar_format(DUEDATE),'YYYYMMDD'))
between date(timestamp_format(varchar_format(ANYGIVENDATE),'YYYYMMDD')) - X days
and date(timestamp_format(varchar_format(ANYGIVENDATE),'YYYYMMDD')) + X days
在某些情况下可能会影响性能。在IBM System i(以前称为AS / 400)上,您可以尝试
...where date(timestamp_format(varchar(DUEDATE),'YYYYMMDD'))
between date(timestamp_format(varchar(ANYGIVENDATE),'YYYYMMDD')) - X days
and date(timestamp_format(varchar(ANYGIVENDATE),'YYYYMMDD')) + X days
因为VARCHAR_FORMAT()
只适用于日期时间数据类型。或者,您可以计算应用程序中的边界日期,并在WHERE
子句中提供两个十进制值:
...where DUEDATE between GIVENSTARTDATE and GIVENENDDATE