【发布时间】:2011-08-30 03:14:56
【问题描述】:
要在 as400 中查询从今天开始的最后 7 天,因为它将日期存储在 char 类型中,如何从今天开始检索结果,因为我尝试使用诸如
where chardate >= char(days(curdate()) + 7)
但是还是不行
【问题讨论】:
标签: information-retrieval ibm-midrange
要在 as400 中查询从今天开始的最后 7 天,因为它将日期存储在 char 类型中,如何从今天开始检索结果,因为我尝试使用诸如
where chardate >= char(days(curdate()) + 7)
但是还是不行
【问题讨论】:
标签: information-retrieval ibm-midrange
答案分为两部分。第一个涉及到这种特殊风格的 DB2 的日期数学。等效于curdate()) + 7 的DB2 表达式是current date + 7 days。
第二个涉及将日期值转换为字符值(反之亦然),以便我们可以比较它们。我们需要知道chardate 存储日期的格式,然后才能真正破解那个格式。假设它是YYYY-MM-DD 格式。然后您可以使用char(current date + 7 days, iso) 以相同格式获取未来 7 天。
因此,根据这个假设,您的 where 语句将是
where chardate >= char(current date + 7 days, iso)
date 可以转换为几种标准日期格式:
YYYY-MM-DD
MM/DD/YYYY
DD.MM.YYYY
YYYY-MM-DD
如果您的chardate 格式不同,您将需要对substr 进行一些相当繁琐的工作。例如,要将YYYY-MM-DD 转换为YYYYMMDD,您需要类似
substr(char(current date, iso), 1, 4) ||
substr(char(current date, iso), 5, 2) ||
substr(char(current date, iso), 7, 2)
这种方法的一个主要问题是不能可靠地比较未按“年月日”顺序存储的格式。也就是说,12311969(即MMDDYYYY)将比较大于01012011,因为就数据库而言,您正在比较两个八位数字。 (这就是为什么您应该几乎总是将日期存储在实际的 date 字段或 YYYYMMDD 或类似的正确排序格式中。)
我使用名为idate 的免费实用程序取得了巨大成功,该实用程序提供SQL 用户定义函数(UDF) 将存储在字符和数字字段中的日期转换为日期。请注意,此解决方案需要 RPG 编译器的可用性。
【讨论】:
从今天起的最后 7 天:
where
date(substr(chardate,1,4) || '-' ||
substr(chardate,5,2) || '-' ||
substr(chardate,7,2)) between current date - 7 days and current date
执行字符范围比较:
where
chardate between
substr(char(current date - 7 days, iso),1,4) ||
substr(char(curernt date - 7 days, iso),6,2) ||
substr(char(current date - 7 days, iso),9,2)
and
substr(char(current date, iso),1,4) ||
substr(char(current date, iso),6,2) ||
substr(char(current date, iso),9,2)
【讨论】:
chardate 的任何索引。