使用SQL检索一段时间内的记录

时间:2014-10-18 14:55:35

标签: sql date db2

我的表中有一个名为DUEDATE的列名为table1,它是格式为CCYYMMDD的日期(这是一个db2数据库)。

我想在X天内检索DUEDATE条记录"" ANYGIVENDATE的{​​{1}},例如在ANYGIVENDATE的3天内,可能意味着DUEDATE之前和之后3天匹配日期的所有ANYGIVENDATE条记录。

虽然我可以提供CCYYMMDD参数,但我很难撰写查询。

我猜我需要检索记录

WHERE [DUEDATE] = [ANYGIVENDATE ± X DAYS] 

CCYYMMDD格式)?

2 个答案:

答案 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