- PR -

年月が含まれるデータの抽出方法

1
投稿者投稿内容
どんたくお
ベテラン
会議室デビュー日: 2005/08/29
投稿数: 88
投稿日時: 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文では、抽出できません。
// 当然ですが・・・。


現在年を持たないのは、毎年何月何日〜何月何日まで同じ期間を使用するからです。


何月何日〜何月何日までというデータを抽出する場合、やはり年というデータを持たないと、抽出できないでしょうか。

ご教授いただけると幸いです。
よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-29 18:30
引用:

どんたくおさんの書き込み (2007-01-29 17:23) より:

何月何日〜何月何日までというデータを抽出する場合、やはり年というデータを持たないと、抽出できないでしょうか。


そうでしょう。
年でなくとも年の変わりは必要です。
初めから '日付型' を使った方が良くないでしょうか。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
どんたくお
ベテラン
会議室デビュー日: 2005/08/29
投稿数: 88
投稿日時: 2007-01-29 18:57
じゃんぬねっとさん、ご返信ありがとうございます。

やはり、そうですね。
自分も、書き込んでやっぱり、年を持たないと、判断つかないなと、浅はかながら思いました。

そこで、また自分なりに考えてみました。
先ほどのテーブルを
CREATE TABLE test (
id serial primary key
start_date date,
end_date date,
);

とした場合、毎年というのをどのように表現するかという点です。

何月何日から何月何日というデータは、固定ですので、10年くらい
先までデータを埋めてもよいのですが、そうした場合、もしその期間
が変更になった場合、また10年先までデータ登録のしなおしという
作業が発生し、他に何か手はないかと考えてしまいます。


それか、プログラム今回はJAVAを使っておりますので、そちらで
少しデータ加工するという方法ですかね。


またご教授いただけるとありがたいです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-29 19:09
引用:

どんたくおさんの書き込み (2007-01-29 18:57) より:

毎年というのをどのように表現するかという点です。


安易な考えをしますと、extract を使ってフィールドの一部を抽出するとか。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 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 ]
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-01-29 23:17
ちょっと見難いですが・・・
コード:
(
	(
		(start_month || start_day) > (end_month || end_day)
	) and
	(
		('01' || '01') BETWEEN (start_month || start_day) AND ('1231') or
		('01' || '01') BETWEEN ('0101') AND (end_month || end_day)
	)
) or
(
	(
		(start_month || start_day) <= (end_month || end_day)
	) and
	(
		('01' || '01') BETWEEN (start_month || start_day) AND (end_month || end_day)
	)
)


要は、

開始より終了が前、かつ、開始から年末もしくは年始から終了に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が含まれる」は評価されません。
どんたくお
ベテラン
会議室デビュー日: 2005/08/29
投稿数: 88
投稿日時: 2007-01-30 19:29
みなさま、ご返信いただきまして、ありがとうございます。
また、ご返答が遅くなりまして、すみません。

>じゃんぬねっとさま
extractというので、特定のフィールドを抽出できるのですね。
今までは、TO_CHAR(NOW(), 'yyyy')のようにしておりました・・・。

>明智重蔵さま
まさに、この掲示板と同じ内容でした。
自分は、料金計算ではないのですが、毎年変化しない何月何日から何月何日までのデータとマスターを抽出する必要がありました。参考にさせていただきます。

>かつのりさま
サンプルコードまで作成してくださって、ありがとうございます。
こちらで、自分の問題のレコードが抽出されたテーブルにSQL文を発行してみますと、希望のレコードが抽出されました。
解説も論理立てていただいて、自分も理解できました。
なるほどと、思いました。


自分の力量のなさを悟ると供に、解決方を提示していただきました、皆様に感謝です。

ご返信していただきました皆様、ありがとうございましたm(_|_)m
1

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