none
特定の列取得 RRS feed

  • 質問

  • ご教授お願い致します。

     sqlserverで以下のテーブルを作成しました。

     カレンダーテーブル
     
     カレンダーテーブルは
     年月 date
      1日  tinyint /*0:対象外,1:稼働日,2:休日*/
     ・
     ・
     ・
     31日 tinyint
     
      このテーブルを使用して指定した日付取得を
     行いたいのですが、例えば
     
     既に、カレンダーテーブルに
     年月   1日,・・・・・・・30日,31日
      2011/05/01 2,1,1,1,1・・・・1,1 
     2011/06/01  1,1,1,2,2・・・・1,0
      2011/07/01  1,2,2,1,1・・・・2,2 とレコードが存在します。
     
     とある入力パラメータに2011/07/01とリードタイムに3とされたら
     出力結果として2011/6/28と返ってくる(3日前の日付を取得、カレンダーテーブルの日付0は計算しない)
     ストアドを利用して考えているのですが
     うまくいきません。というかお手上げです。

     お手数ですが、教えて頂ければありがたいです。
     

     以上

    2011年7月5日 5:43

回答

  • こういうことですね

    create table calendar(
    nen date,
    day01 tinyint,
    day02 tinyint,
    day03 tinyint,
    ・・・
    day31 tinyint)

    データを入れて
    insert into calendar values
    ('2011/05/01',2,1,1,1・・・,0),
    ('2011/06/01',1,1,1,2・・・,0),
    ('2011/07/01',1,2,2,0・・・,0)

    以下のSQLをFetchしてうまいことやってみてください。

    (day04からday30はご自分で追加してみてください)

    select DATEADD(DAY,0,nen),day01 from calendar where day01 >0
    union all
    select DATEADD(DAY,1,nen),day02 from calendar where day02 >0
    union all
    select DATEADD(DAY,2,nen),day03 from calendar where day03 >0
    ・・・
    union all
    select DATEADD(DAY,30,nen),day31 from calendar where day31 >0
    order by 1 desc

     

    • 回答としてマーク zeak01 2011年7月7日 5:59
    2011年7月5日 11:28

すべての返信

  • 2011/07/01以下の条件で、order by で大きい順に並べてtop (3)で3つのデータを取得し、それら3つをさらに小さい順で並べてtop (1)を取れば、それが目的のレコードになります。
    試していませんが以下のような感じです。

    select top (1) * from (select top (3) * from カレンダーテーブル T where T.年月 <= 2011/07/01 order by T.年月 desc) TT
                           order by TT.年月

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年7月5日 6:33
  • こういうことですね

    create table calendar(
    nen date,
    day01 tinyint,
    day02 tinyint,
    day03 tinyint,
    ・・・
    day31 tinyint)

    データを入れて
    insert into calendar values
    ('2011/05/01',2,1,1,1・・・,0),
    ('2011/06/01',1,1,1,2・・・,0),
    ('2011/07/01',1,2,2,0・・・,0)

    以下のSQLをFetchしてうまいことやってみてください。

    (day04からday30はご自分で追加してみてください)

    select DATEADD(DAY,0,nen),day01 from calendar where day01 >0
    union all
    select DATEADD(DAY,1,nen),day02 from calendar where day02 >0
    union all
    select DATEADD(DAY,2,nen),day03 from calendar where day03 >0
    ・・・
    union all
    select DATEADD(DAY,30,nen),day31 from calendar where day31 >0
    order by 1 desc

     

    • 回答としてマーク zeak01 2011年7月7日 5:59
    2011年7月5日 11:28
  •  ありがとうございます。

     このクエリを利用したら目的が果たせました。

     

    2011年7月7日 5:59