- - PR -
年月が含まれるデータの抽出方法
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-01-29 17:23
みなさん、こんにちは。
どんたくおです。 少し迷っているの、皆様の知恵をおかしいただければ幸いです。 PostgreSQL 7.3系を使用しております。 現在、何月何日〜何月何日のデータというのを抽出しようと思っています。 テーブルは以下です。 CREATE TABLE test( id serial primary key, start_month varchar(10), start_day varchar(10), end_month varchar(10), end_day varchar(10) ); としました。 1月1日が含まれるデータは、 SELECT * FROM test WHERE ('01' || '/' || '01') BETWEEN (start_month || '/' || start_day) AND (end_month || '/' || end_day) と抽出できると考えたのですが、実は致命的な問題があり、月が年をまたいで登録された場合 例えば、 INSERT INTO test(start_month, start_day, end_month, end_day) VALUES('12', '01', '01', '31'); のような場合、上記の抽出SQL文では、抽出できません。 // 当然ですが・・・。 現在年を持たないのは、毎年何月何日〜何月何日まで同じ期間を使用するからです。 何月何日〜何月何日までというデータを抽出する場合、やはり年というデータを持たないと、抽出できないでしょうか。 ご教授いただけると幸いです。 よろしくお願いします。 | ||||
|
投稿日時: 2007-01-29 18:30
そうでしょう。 年でなくとも年の変わりは必要です。 初めから '日付型' を使った方が良くないでしょうか。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-01-29 18:57
じゃんぬねっとさん、ご返信ありがとうございます。
やはり、そうですね。 自分も、書き込んでやっぱり、年を持たないと、判断つかないなと、浅はかながら思いました。 そこで、また自分なりに考えてみました。 先ほどのテーブルを CREATE TABLE test ( id serial primary key start_date date, end_date date, ); とした場合、毎年というのをどのように表現するかという点です。 何月何日から何月何日というデータは、固定ですので、10年くらい 先までデータを埋めてもよいのですが、そうした場合、もしその期間 が変更になった場合、また10年先までデータ登録のしなおしという 作業が発生し、他に何か手はないかと考えてしまいます。 それか、プログラム今回はJAVAを使っておりますので、そちらで 少しデータ加工するという方法ですかね。 またご教授いただけるとありがたいです。 | ||||
|
投稿日時: 2007-01-29 19:09
安易な考えをしますと、extract を使ってフィールドの一部を抽出するとか。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-01-29 20:02
OTNに同じのがありました
http://otn.oracle.co.jp/cgi-bin/non/msgview_r.cgi?communityid=otn-489965&bbsid=1&no=98625&view=9 ついでの数学ネタも投下 http://aozoragakuen.sakura.ne.jp/houhouNII/node33.html http://konoten.hopto.org/404/404ogino3.htm 場合分けしなくても、 OTNにあるように、大晦日と元旦のデータを作ってbetweenで比較してもいいですけどね [ メッセージ編集済み 編集者: 明智重蔵 編集日時 2007-02-03 07:25 ] | ||||
|
投稿日時: 2007-01-29 23:17
ちょっと見難いですが・・・
要は、 開始より終了が前、かつ、開始から年末もしくは年始から終了に01/01が含まれる、 または、 開始より終了が後、かつ、開始から終了に01/01が含まれる って事です。 1201から0131だと、 0101 between 1201 and 1231 or 0101 between 0101 and 0131 になります。下の「開始より終了が後」には該当しないので、 「開始から終了に01/01が含まれる」は評価されません。 0101から0131だと、 0101 between 0101 and 0101 になります。上の「開始より終了が前」には該当しないので、 「開始から年末もしくは年始から終了に01/01が含まれる」は評価されません。 | ||||
|
投稿日時: 2007-01-30 19:29
みなさま、ご返信いただきまして、ありがとうございます。
また、ご返答が遅くなりまして、すみません。 >じゃんぬねっとさま extractというので、特定のフィールドを抽出できるのですね。 今までは、TO_CHAR(NOW(), 'yyyy')のようにしておりました・・・。 >明智重蔵さま まさに、この掲示板と同じ内容でした。 自分は、料金計算ではないのですが、毎年変化しない何月何日から何月何日までのデータとマスターを抽出する必要がありました。参考にさせていただきます。 >かつのりさま サンプルコードまで作成してくださって、ありがとうございます。 こちらで、自分の問題のレコードが抽出されたテーブルにSQL文を発行してみますと、希望のレコードが抽出されました。 解説も論理立てていただいて、自分も理解できました。 なるほどと、思いました。 自分の力量のなさを悟ると供に、解決方を提示していただきました、皆様に感謝です。 ご返信していただきました皆様、ありがとうございましたm(_|_)m |
1