0

我正在努力寻找今年将年满 70.5 岁的人。

dob7 = DECIMAL(7) YYYYDDD

select acctno, name, address, status, year(curdate()) - year(date(digits(dob7))) as Age
from mydata.cdmast cdmast
left join mydata.cfmast cfmast
on cdmast.cifno = cfmast.cifno
where status <> 'R' and year(curdate()) - year(date(digits(dob7))) >= 70

上面的代码返回以下错误:

[Error Code: -181, SQL State: 22008] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0181 - Value in date, time, or timestamp string not valid.

4

4 回答 4

2

看到其他答案后,我正在提交自己的答案。这应该有在 上使用任何索引的好处dob7,并且应该在没有太多“技巧”的情况下工作。

我已经修改了WHERE您原始查询中的子句。我假设“.5 年”意味着“6 个月”,尽管这是可以调整的。我故意将计算包裹在 CTE 中以“封装”逻辑;这些操作应该几乎是免费的。

WITH Youngest (dateOfBirth) as (
               SELECT CURRENT_DATE - 70 YEARS - 6 MONTHS
               FROM sysibm/sysdummy1),
     Converted (dateOfBirth, formatted) as (
                SELECT dateOfBirth, YEAR(dateOfBirth) * 1000 + DAYOFYEAR(dateOfBirth)
                FROM Youngest)
SELECT acctno, name, address, status, 
       YEAR(CURRENT_DATE) - INT(dob7 / 1000) 
                          - CASE WHEN DAYOFYEAR(CURRENT_DATE) < MOD(dbo7, 1000)
                                 THEN 1
                                 ELSE 0 END as Age
FROM myData.cdMast cdMast
JOIN Converted
ON Converted.formatted >= dob7
LEFT JOIN myData.cfMast cfMast
ON cdMast.cifno = cfMast.cifno
WHERE status <> 'R'

请注意,它会将闰日出生的人视为在 3 月 1 日过生日(由于DAYOFYEAR())。

于 2012-07-18T23:41:27.657 回答
1

DATE标量函数文档:

实际长度为 7 的字符串,以yyyynnn形式表示有效日期,其中yyyy是表示年份的数字,而nnn是 001 到 366 之间的数字,表示该年的某一天。

重新格式化日期:

DATE(SUBSTR(DIGITS(DOB7),4,4) || SUBSTR(DIGITS(DOB7),1,3))

要在当年年底前选择 70.5 岁或以上:

YEAR(CURRENT_DATE) - YEAR(DATE(SUBSTR(DIGITS(DOB7),4,4) || SUBSTR(DIGITS(DOB7),1,3))) = 70
AND MONTH(DATE(SUBSTR(DIGITS(DOB7),4,4) || SUBSTR(DIGITS(DOB7),1,3))) >= 6
OR YEAR(CURRENT_DATE) - YEAR(DATE(SUBSTR(DIGITS(DOB7),4,4) || SUBSTR(DIGITS(DOB7),1,3))) > 70
于 2012-07-18T16:18:46.860 回答
0

错误消息是说 DOB7 的内容不能转换为日期。DOB7 的值是否与其中一种有效格式匹配?请注意,许多需要引号。 http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/index.jsp?topic=/db2/rbafzscadate.htm

于 2012-07-18T15:47:47.877 回答
0

试试这个:

(year(curdate()) - mod(dob7, 10000)) >= 70

这是使用模运算来提取年份,而不是尝试将其转换为日期。

顺便说一句,以这种方式存储日期似乎很尴尬。数据库具有对日期和时间的内置支持,因此通常最好以本机格式存储它们。

如果您的出生日期确实是 yyyymmm,那么以下内容应该可以使用多年:

(year(curdate()) - cast(dob7/1000 as int)) >= 70

半年时间:

(year(curdate()) - cast(dob7/1000 as int))+(1-mod(dob7,1000)/365.0) >= 70.5
于 2012-07-18T15:26:03.617 回答