我正在使用一个数据库,它将多个字段中的日期存储为整数(模拟字段名称):
我可以这样制定一个日期: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(如果可能的话)。
答案 0 :(得分:1)
您是否有权修改数据库架构? 如果是这样,您可以考虑日期的“生成列”:
答案 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。