2011-05-21 236 views
-2

从今天查询最后7天AS400,因为它存储在char类型日期如何从今天的结果,我尝试使用诸如AS400日期查询

 where chardate >= char(days(curdate()) + 7) 

但它仍然没有工作

回答

2

对于从今天过去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) 
+0

@JamesA:只要您不希望查询使用任何包含'chardate'的索引,这可以是一个好的选择。 – dmc 2011-05-23 15:40:24

+0

@dmc:好点。我没有想到索引优化。 – jamesallman 2011-05-23 16:41:37

+0

但是它仍然返回超过65000行而不是7天的行 – jbsuser 2011-05-28 07:03:49

4

答案有两部分。第一个涉及这个特定风格的DB2的日期数学。相当于curdate()) + 7的DB2表达式是current date + 7 days

第二个涉及将日期值转换为字符值(反之亦然),以便我们可以比较它们。我们需要知道什么格式chardate存储日期之前,我们可以真正破解那一个。我们假设它的格式为YYYY-MM-DD。然后,您可以使用char(current date + 7 days, iso)以相同的格式在将来获得七天。

所以,用这种假设,你在那里声明将是

where chardate >= char(current date + 7 days, iso) 

有几个标准的日期格式date可转换为:

  • ISO:YYYY-MM-DD
  • 美国:MM/DD/YYYY
  • EUR:DD.MM.YYYY
  • JIS: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)的将char &数字字段中存储的日期转换为日期。请注意,该解决方案需要RPG编译器的可用性。

+0

其中chardate> =日期(当前日期+ 7天,异)我得到了错误coloumn iso不在指定的表格中,我的日期格式是在yyyymmdd字符类型我试过上面的三个查询,但它没有奏效。也得到相同的错误日期,时间或时间戳字符串中的值无效 – jbsuser 2011-05-22 06:54:03

+0

@ jbs123 @dmc用示例where语句做了一个错字。它应该是“where chardate> = char(当前日期+ 7天,iso)” – jamesallman 2011-05-23 14:58:01

+0

@JamesA感谢您的更正! – dmc 2011-05-23 15:34:23