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スカラー関数のドキュメントから:

有効な日付をyyyynnnの形式で表す、実際の長さが 7 の文字列。ここで、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 に答える