• 締切済み

期間の抽出方法

現在、サイクルテーブルというテーブルに開始月に”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

  • 片方だけ抽出する方法(SQL)

    下記のようなテーブルがあるとします。 Aテーブル コード 値 X 10 Y 20 Z 30 Bテーブル コード 値 Y 20 Y 30 Z 30 A.コード=B.コードとA.値=B.値という条件に一致しないデータのうち、 Aテーブルのデータのみ取り出したいです。 この場合だと、「X 10」のみ結果として欲しいです。 どのようなSQLを作成すればいいか、分かりません。 考え方の問題なのかもしれませんが、ぜひ教えてください。

  • 配列に指定した値が含まれているものを抽出する方法

    こんにちは。 いつもお世話になっております。 SQLにて、配列のフィールドに指定した値が含まれているものを抽出する方法を質問致します。 SQLのテーブル(テーブル名:data)に配列のフィールド(フィールド名:array[])があるとします。 Array[]フィールドの中に、1, 2, 6のいずれかが含まれている場合表示対象となるSQL文を書くには、どのように書けばよいですか。PostgreでSQL文を書くとします。 実現したい動作は以下の通りです。 array[] の値 {1,3,5} 表示対象になる {3,8,9,10}  表示対象にならない {2,6} 表示対象になる 以上よろしくお願い致します。 ちなみに、array[]フィールドの中に、2(指定した数値が1つだけ)を探すとき、 select * from data where 2=any (array); とすればいいことは確認できました。

  • 2つのテーブルに差異があるデータを抽出する方法

    このようなことが実現できるのかというご相談です。 ご存知の方がいらっしゃいましたらご教授ください。 環境はSQL Server2008です。 2つのテーブルがあります。 1度のSQLでその2つを比較し、以下の条件のデータを抽出することは可能なものでしょうか? (1)テーブルAに存在するが、テーブルBにはない (2)テーブルBに存在するが、テーブルAにはない (3)テーブルAとBの両方に存在するが、項目のいずれかが異なる。 なお、テーブルBには、テーブルAには存在しない項目がありますが、 その項目は比較対象外です。 お知恵を拝借できましたら、とてもありがたいです。 よろしくお願いいたします。 ■テーブルA Key Komoku1 Komoku2 001 1000 2000 002 2000 3000 005 3000 4000 006 4000 5000 ■テーブルB Key Komoku1 Komoku2 Komoku3 001 1000 2000 X1 003 2000 3000 X2 005 3000 5000 X3 006 4000 5000 X4 ■結果 Key Komoku1 Komoku2 002 2000 3000 003 2000 3000 005 3000 4000 (あるいは 005 3000 5000) ※005はテーブルA,B両方には存在するが、koumoku2の値が違う例です。 その場合、どちらのテーブルの値を出力しても構いませんし、あるいは両方を 出力しても構いません。 よろしくお願いいたします。

  • リレーションをSQL文で作る方法は?

    urizakaです 今まではSQL-Serverを使っていたのですが、今度からPostgresSQLを使うこと になりました。 さて、そこで質問なのですが、SQL文でテーブルを作るとき、他のテーブルの カラム(フィールド)と作ったテーブルのカラム(フィールド)のリレーションを 作るにはどうすれば良いのでしょうか? 特に、シリアル型で作ったフィールドの値を外部参照キーとして持ってきたい 場合はどのようにSQL文を書けばよいのでしょうか? すみませんが、よろしくお願いします。

  • 集計方法のアドバイスほしいです!

    大急ぎで作らなくてはならないクエリがあるのですが、どうもうまくいきません。。。 テーブル項目には ・お小遣いをくれる人 ・お小遣いの額 ・もらえる期間の開始月 ・もらえる期間の終了月 を持っています。 レコードのサンプル年は くれる人,小遣い額 ,開始月 ,終了月 aさん \1000 ,2008/01 ,2008/10 bさん \2000 ,2008/03 ,2008/12 cさん \500 ,2008/03 ,2008/04 といった感じです。 これを月別にいくらもらえるか合計値を求めたいのですが、 どうもうまくいきません。 私がやった方法としては、 「年月」という項目のみもった月テーブル(2000/01~2999/12というデータ入力済み)をつくり、以下のSQLで小遣いテーブルとぶつけるというものです。 select 月テーブル.年月, (select sum(小遣いテーブル.小遣い額) from 小遣いテーブル where 月テーブル.年月 between 小遣いテーブル.開始月 and 小遣いテーブル.終了月) as 合計額 from 月テーブル データベースソフトはaccessです。 SQLが間違っているのでしょうか? エラー文を見る感じだとaccessではスカラサブクエリが使えないのかな?という感じもするのですが。。。 そもそも、もっといい解決案があったらぜひともご教示いただければと思います。課題とかではなく、頼まれごとなのですが、なかなかできずあせっています- -;

  • 特定範囲内に一部でも属す線分を抽出する方法

    現在MySQLにてシステムの構築を考えていますが、 SQLの組み立てについて壁に当たったので、質問させて頂きます。 線分の座標を表す以下のようなテーブルが存在するとします。 線分テーブル「tblLine」 項目:  開始X座標[SX],  開始Y座標[SY],  終了X座標[EX],  終了Y座標[EY] このテーブルから任意の座標点(PX,PY)に 近い線分を抽出しようと考えております。 具体的には、上記座標点のX座標、Y座標を プラスマイナス10して出来る以下の4点 (PX-10,PY-10) (PX+10,PY-10) (PX-10,PY+10) (PX+10,PY+10) からなる四角形に、線分の一部でも属すものを すべて抽出できればと考えています。 線分の一部でも属すもので、考えられるパターンは (1)線分すべてが四角形に含まれる。 (2)線分の開始点or終了点のどちらかが四角形に含まれる。 (3)線分の開始点or終了点を除く一部が四角形に含まれる。 になると思います。 (1)、(2)については、開始点と終了点の座標のどちらかが PX-10~PX+10とPY-10~PY+10の条件を満たすものとして 抽出すればよい為、SQLを組み立てるのは難しくないですが、 (3)についてはどのようにSQLを組み立てればよいのかが わかりません。 ちなみに、範囲を四角形にしたのは、 SQLを簡素に、重くならないように考えてのことです。 円(点からの距離)のが簡単or速いということであれば その方法をご教授願いたいです。 ご回答、またはアドバイスをよろしくお願い致します。

    • ベストアンサー
    • MySQL
  • ACCESS期間抽出について

    ACCESS2002で請求書を作っています。 売り上げデータから2005年3月1日~2005年3月31日までを抽出して請求書を印刷したところ、3月4日~9日だけ抽出できませんでした。 そのデータを3月3日や10日に訂正すると抽出されるのです。 請求書印刷フォームに、開始年、月、日と終了年、月、日というテキストボックスを作って抽出して、レポートに印刷するようにしています。 クエリーで、年月: Year([日付]) & Month([日付]) & Day([日付])という項目で次のように抽出条件を入れています。 Between [Forms]![F-請求書印刷]![年] & [Forms]![F-請求書印刷]![月] & [Forms]![F-請求書印刷]![日] And [Forms]![F-請求書印刷]![年終] & [Forms]![F-請求書印刷]![月終] & [Forms]![F-請求書印刷]![日終] 開始日と終了日だけのテキストボックスにしないで、年、月、日と分けているのは、レポートでそれぞれ値の代入で使用するためです。 3日から9日だけ出ないという原因がわからないので、教えていただけませんでしょうか? よろしくお願いいたします。

  • 期間内のデータ抽出

    テーブル名:HOGE ID  DATE1     DATE2     FLG ------------------------------------------------------------ 001  2012-07-01  2012-07-15  0 002  2012-07-10  2012-07-20  0 003  2012-07-01  2012-08-01  0 004  2012-07-05  2012-07-19  1 005  2012-07-20  2012-07-31  0 006  2012-07-07  2012-07-15  0 で、本日の日付(2012年7月9日)がDATE1~DATE2に入る、かつFLGが0のレコードだけ抽出したいです。 上記の場合、 ID 001 003 006 この様に抽出したいのですが、宜しくお願い致します。

  • SQL、特にOralce 8iに関して、データの集計に関する質問です。

    SQL、特にOralce 8iに関して、データの集計に関する質問です。 以下のようなデータがあったとします。 [開始年月(int)]  [終了年月(int)]  [値] 201001      201004      1 201003      201007      2 201005      201010      3 201007      201101      4 このとき以下のような感じで、重複している月で値を合算し、一番値が大きな月を求めるには、どうすればよいでしょうか。 1 2 3 4 5 6 7 8 9 101112 (月) ■■■■________ __■■■■■_____ ____■■■■■■__ ______■■■■■■ ↓↓↓↓↓↓↓↓↓↓↓↓ 1 1 3 3 5 5 9 7 7 7 4 4 (計) ←この場合 7月が一番大きかった できればPL/SQLなしで解決したいと思っております。 ご教示お願いいたします。

  • Excelで期間の計算の方法が分からなくて困っています。

    Excelの起算日から到達日までのサイクル数を計算するのにあたって、計算方法が分からず困っています。 <内容> 下記の条件で起算日から到達日までのサイクル数を求める。 <条件> ・ 1~15日、16日~末日を各々1サイクルとして計算。 ・ 最初の中途になるサイクル分はカウントしない。 <例>  2008年12月10日(起算日)~2009年2月12日(到達日) 2008年12月10日~2008年12月15日  ・・・・・ カウントせず。 2008年12月16日~2008年12月31日  ・・・・・ 1カウント 2009年 1月 1日~2009年 1月15日  ・・・・・ 1カウント 2009年 1月16日~2009年 1月31日  ・・・・・ 1カウント 2009年 1月 1日~2009年 2月12日  ・・・・・ 1カウント 上記のように計算。 この例の場合、求める値は「4」となる。 私が考えたのは、 If(Day(起算日)<=15,Date(Year(起算日),Month(起算日),16),Date(Year(起算日),Month(起算日)+1,1)) として、カウントしない期間をリセットする。 ここまでは分かるのですが、それ以降、どういう計算方法をしたらいいか思いつきません。 DATEDIF関数が妥当と思うのですが、15日を基点に2つカウントし、到達日が15日を超えるか超えないかでカウント数がかわってきます。 何かいい方法がありますでしょうか。

このQ&Aのポイント
  • バツイチ同士のカップルで、マッチングアプリで知り合った。
  • 彼は私のタイプではないが、私は彼しかいないと感じて付き合い始めた。
  • 彼は愛情表現が下手だが、積極的にデートを計画してくれる。でも、彼からお母さんと言われてショックを受けている。気持ちを切り替える方法を知りたい。
回答を見る