- PR -

数値列から日付計算

投稿者投稿内容
未記入
会議室デビュー日: 2008/10/01
投稿数: 5
投稿日時: 2008-10-01 12:01
こんにちは。初投稿ですよろしくお願いします。
日付の取得について相談したいです。
日付を分割した複数の列をもつ次のようなテーブルがあります。
ID(int型) 年1(int型) 年2(int型) 月(int型) 日(int型)
1    20  8 9 10
2 20 8 9 20
3 20 8 10 10

このテーブルからある日付以降のデータを取得するWHERE句についてどのような方法がいいでしょうか?
次のように考えました。(DBはDB2/400環境)
WHERE CAST(年1||SUBSTR('0' ||年,LENGTH(TRIM(年2)),2)||SUBSTR('0' ||月,LENGTH(TRIM(月)),2)||SUBSTR('0' ||日,LENGTH(TRIM(日)),2) AS DATE) >= '2008-09-15'

この場合タイムオーバーになります。(レコード数約2000万レコードあります)
他になにかいい方法はないでしょうか?
ご意見お願いします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2008-10-01 12:56
そのSQLだとフルスキャンになってしまうからでしょう。

複合インデックスを使って個別の列単位で条件にするか、
関数インデックスを使うかのどちらかが良さそうに思います。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2008-10-01 13:01
思いつきなんで間違ってるかも AND かえって遅いかもですが

コード:
WHERE
年1 > 20 OR
(年1 = 20 AND 年2 >  OR
(年1 = 20 AND 年2 = 8 AND 月 > 9) OR
(年1 = 20 AND 年2 = 8 AND 月 = 9 AND 日 >= 15)


とか。

2100年以降を考えなくていいのなら

コード:
WHERE 
年1 = 20 AND
(
    年2 > 8 OR
    (年2 = 8 AND 月 > 9) OR
    (年2 = 8 AND 月 = 9 AND 日 >= 15)
)


とか駄目ですかね。
King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2008-10-01 13:04
顔文字になってるところは「8)」のつもりです!
ふるふる
会議室デビュー日: 2008/02/05
投稿数: 19
投稿日時: 2008-10-01 13:47
WHERE
年1*1000000+年2*10000+月*100+日>=20080915

というのはどう?
比較する日付を8桁数値に変換が必要かもしれませんけど、使う関数は少なくて済みますよね。

未記入
会議室デビュー日: 2008/10/01
投稿数: 5
投稿日時: 2008-10-01 13:47
あしゅ様、King様お返事ありがとうございます。
ご意見を頂き感謝します。
未記入
会議室デビュー日: 2008/10/01
投稿数: 5
投稿日時: 2008-10-01 13:51
ふるふる様お返事ありがとうございます。
ご意見を頂き感謝します。
未記入
会議室デビュー日: 2008/10/01
投稿数: 5
投稿日時: 2008-10-01 13:53
これから検証しまして応答速度に満足のいくものを実装していきたいと思います。
皆様ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)