• 締切済み

期間の抽出方法

現在、サイクルテーブルというテーブルに開始月に”2”サイクルに”4”という値が入っていたとします。 これの意味は、2月始まりで1年を4分割しますということです。 つまり、今が、11月だったとした場合、2月~4月が1期、5月~7月が2期、8月~10月までが3期、11月~1月が4期になり、11月は、11月~1月の4期にあたります。 その場合は、11と1の値をSQLでとってきたいのですが、 どのようにすればよいでしょうか。

みんなの回答

  • miko_zz
  • ベストアンサー率0% (0/1)
回答No.3

MIKO_ZZと申します。 下記のようなテストを行うと取得できるとは思います。 でも、自分で書いていても大変分かりにくいSQLです。 期間管理のテーブルを見直すか、ストアドファンクション 等を使って期間を取得できるようにした方が使いやすいと思います。 ※.下記SQLのコメントにも記載してありますがまだ完璧ではありません 12月の場合 0と出力されてしまいます。これ以上DECODE等を使って変換を書くと長くなりそうなので省略しました。まぁ参考になれば幸いです。 -------------------------------------------------- CREATE TABLE TEST_20041118 ( DATA_ID INT PRIMARY KEY, ST_MONTH INT, SPAN INT ) / INSERT INTO TEST_20041118 VALUES ( 1, 2, 4 ) / SELECT -- ここから開始月( 12月は 0となります) MOD( TRUNC( DECODE(TRUNC(((100+TO_NUMBER(TO_CHAR(SYSDATE,'MM')))-ST_MONTH)/100), 1,TO_NUMBER(TO_CHAR(SYSDATE,'MM'))-ST_MONTH, 0,TO_NUMBER(TO_CHAR(SYSDATE,'MM'))-ST_MONTH+12) / (12/SPAN) ) * (12/SPAN)+ST_MONTH ,12) 開始月, -- ここから終了月( 12月は 0となります) MOD( TRUNC( DECODE(TRUNC(((100+TO_NUMBER(TO_CHAR(SYSDATE,'MM')))-ST_MONTH)/100), 1,TO_NUMBER(TO_CHAR(SYSDATE,'MM'))-ST_MONTH, 0,TO_NUMBER(TO_CHAR(SYSDATE,'MM'))-ST_MONTH+12) / (12/SPAN) ) * (12/SPAN)+ST_MONTH+(12/SPAN)-1 ,12) 終了月 FROM TEST_20041118 ; --------------------------------------------------

7_11shop
質問者

お礼

ご解答ありがとうございます。 こうなると、なんで12月の次が1月なのかと思ってしまいます。。 おっしゃるとおりに、一度、プログラムの方でループさせて1次的にテーブルを作ることにしました。 ありがとうございます。

回答No.2

どんな設定でも動くように計算すると、こんな感じ... select to_number(to_char(sysdate,'mm')) as "今", trunc((to_number(to_char(sysdate,'mm')) + 1 - 開始月) / trunc(12 / サイクル)) * trunc(12 / サイクル) + 開始月 as "開始の月", mod(trunc(trunc((to_number(to_char(sysdate,'mm')) + 1 - 開始月) / trunc(12 / サイクル)) * trunc(12 / サイクル) + 開始月 - 1 + trunc(12 / サイクル)),12) as "終了の月" from サイクルテーブル;

7_11shop
質問者

補足

ご返答が遅くなってすいません。 ご解答ありがとうございます。 ご解答いただいた内容で試してみましたが、12月以降に関しては、正しくデータを取得できませんでした。 12月の次が1月なので、12-開始月 =< 0 の式が成り立つ場合はうまくいきませんでした。

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.1

OracleでSQLで抽出するならLikeより日付で抽出するほうが早いと思うのですが。 select * from サイクルテーブル where jcdt between to_date('2004.11.01 00:00:00', 'yyyy.mm.dd hh24:mi:ss') and to_date('2005.01.31 23:59:59', 'yyyy.mm.dd hh24:mi:ss') ; これではどうでしょう。

7_11shop
質問者

補足

ご解答ありがとうございます。 もうしわけありません。私の勉強不足なだけなのかもしれませんが、おそらくこれは、11月と1月というのがわかっていて、その中でサイクルテーブルにある値をとってくるということですよね?そうではなく、逆に11月と1月という値を割り出したいということです。

関連するQ&A