按日期范围过滤日期分为多个字段

时间:2013-07-22 14:07:41

标签: sql db2

我正在使用一个数据库,它将多个字段中的日期存储为整数(模拟字段名称):

  • Century:CC01:20
  • 年份:YR01:13
  • 月:MO01:7
  • 日:DY01:22

我可以这样制定一个日期:DATE((CC01 * 100 + YR01) || '-' || MO01 || '-' || DY01)

问题在于我需要过滤一系列日期。例如,如果我想选择过去90天,我可以写这样的东西......

WHERE DATE((CC01 * 100 + YR01) || '-' || MO01 || '-' || DY01) >= CURRENT DATE - 90 DAYS

这里的问题是性能。我正在寻找一种有效的方法来编写这个公式,使函数仅限于等式的右边。

这是一个适用于今天日期的例子(我不需要担心世纪,我要省略一些细节):

WHERE CC01 = 20 AND YR01 >= RIGHT(YEAR(CURRENT DATE - 7 DAYS),2) AND MO01 >= MONTH(CURRENT DATE - 7 DAYS) AND DY01 >= DAY(CURRENT DATE - 7 DAYS)

这只能起作用,因为回溯7天让我们保持当前的月份和年份。我也不希望有大量的AND和OR(如果可能的话)。

4 个答案:

答案 0 :(得分:1)

您是否有权修改数据库架构? 如果是这样,您可以考虑日期的“生成列”:

https://www.ibm.com/developerworks/community/blogs/SQLTips4DB2LUW/entry/expression_generated_columns?lang=en

答案 1 :(得分:1)

您要查询的日期范围的长度是否有限制? 对于短距离,您可以生成详细的动态SQL,如:

WHERE
    (CC01 = 20 AND YR01 = 07 AND MO01 = 02 AND DY01 = 01)
 OR (CC01 = 20 AND YR01 = 07 AND MO01 = 03 AND DY01 = 04)
 OR (CC01 = 20 AND YR01 = 07 AND MO01 = 04 AND DY01 = 03)

你必须剖析以查看更长的查询是否能够补偿更快的查询(我的直觉说数字记录中的函数调用会更慢,尽管直觉永远不会被信任)。

答案 2 :(得分:1)

我相信我可能找到了解决方案。

        CC01 = 20
        AND
        YR01 >= RIGHT(YEAR(CURRENT DATE - 220 DAYS),2)
        AND NOT
            (
            YR01 = RIGHT(YEAR(CURRENT DATE - 220 DAYS),2)
            AND
            MO01 = MONTH(CURRENT DATE - 220 DAYS)
            AND
            DY01 < DAY(CURRENT DATE - 220 DAYS)
            )
        AND NOT
            (
            YR01 = RIGHT(YEAR(CURRENT DATE - 220 DAYS),2)
            AND
            MO01 < MONTH(CURRENT DATE - 220 DAYS)
            )

答案 3 :(得分:0)

定义要转换为日期的函数

CREATE FUNCTION parts2date (cc int, yy int, mm int,  dd int ) returns date
    LANGUAGE SQL
    CONTAINS SQL
    DETERMINISTIC
  BEGIN
    RETURN DATE( RIGHT(DIGITS(cc),2)||RIGHT(DIGITS(yy),w)||'-'
               ||RIGHT(DIGITS(mm),2)||'-'||RIGHT(DIGITS(dd),2) );
  END;

您可以添加条件处理程序,以便在错误时返回null。