日付範囲を展開したレコードを作成する方法

このQ&Aのポイント
  • Oracleでストアドパッケージを作成している場合、与えられた日付範囲を展開してレコードを作成したい場合、ストアド内で実装することが可能です。
  • 与えられたデータから、日付の範囲を展開して新しいレコード群を作成したい場合、ストアドを使用することが一般的です。
  • Typeは使用できないため、展開後のレコードは別途SQLで利用する必要があります。
回答を見る
  • ベストアンサー

日付範囲を展開したレコードを作成したい

Oracleでストアドパッケージを作っています。 key1 key2 key3 sdate   edate 1   1   1   2012/07/12 2012/09/11 2   2   2   2012/06/01 2012/07/31 こんなデータがあった時、以下のように日付の範囲を展開した レコード群を得たいのですが、やり方が思いつきません。 key1 key2 key3 date 1   1   1   2012/07/01 1   1   1   2012/08/01 1   1   1   2012/09/01 2   2   2   2012/06/01 2   2   2   2012/07/01 事情により、Typeは使えません。 展開後、別途SQLで利用するつもりです。 ストアド内だけで実装可能でしょうか?

  • Oracle
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

Oracleのバージョンが書いていないのですが、10g以降であればmodel句を使って、こんな感じでどうでしょうか。 SDATE、EDATEのデータ型が不明なのでDate型と言う前提です。 --この部分はテーブルを作るのが面倒なので疑似データを用意しているだけです with tableA as ( select 1 KEY1, 1 KEY2, 1 KEY3, date '2012-07-12' SDATE, date '2012-09-11' EDATE from DUAL union all select 2 KEY1, 2 KEY2, 2 KEY3, date '2012-06-01' SDATE, date '2012-07-31' EDATE from DUAL ) --実際のSQLはここから select key1,key2,key3,to_char(dt, 'yyyy/mm/dd') dt from tableA model partition by (KEY1,KEY2,KEY3) dimension by (0 as IND) measures(trunc(SDATE, 'mm') as DT, months_between(trunc(EDATE,'mm'), trunc(SDATE,'mm')) as TERM) rules(DT[for IND from 0 to TERM[0] increment 1] = add_months(DT[0], cv(IND)));

naktak
質問者

お礼

ありがとうございます。 試して見たところ、思うようなことができそうでした。 ちょっと意味がわからないので、調べながら応用きかせつつ実装してみようかと思います。

その他の回答 (1)

  • hogya
  • ベストアンサー率67% (49/73)
回答No.1

Oracle 11g R1以降であれば、Pivot(UnPivot)を駆使すれば実現できると思います。

naktak
質問者

お礼

ありがとうございます。 Pivotを調べてみましたが、どうも駆使の仕方が難しそうなので諦めました・・・。

関連するQ&A

  • ACCESS97のモジュールで 日付の計算をしたい

    以前の例題を検索したのですが 改めて質問します。 ACCESS97のモジュールで 日付の計算をしたいのです。 例えば ある日付を入力すれば、その2週間後の日付を取得したいのです。  テキストボックス "日付"で入力するとします Dim Sdate As Date  Dim Edate As Date Sdate = Format(Me.日付, "yy/mm/dd") Edate = Format(Sdate+14, "yy/mm/dd") ← ではエラーになります。 Q どうすればいいのでしょうか?

  • postgreSQLで分からないことがあります。

    postgreSQLで分からないことがあります。 よろしくお願いします。 下にあるtblというテーブルがあったとき。 下のSQLを実行するとデータがうまく取れているんですが、 CURRENT_DATEは日付型でSUBSTRでとりだした日付は文字列 なのに何故正しく比較できているのでしょうか? 日付型の形式の文字列であれば、RDBMSがかってに日付型にしてくれるのでしょうか? tblテーブル *sdateとedateはtimestamp型です。 sdate      | edate | ----------------------------------------- 2010-5-1 10:00:00 | 2010-5-2 13:00:00| SELECT * FROM tbl WHERE CURRENT_DATE BETWEEN SUBSTR(sdate, 1, 10) AND SUBSTR(edate, 1, 10)

  • VBA 日付型を8桁数値へ変換

    VBAの中で、Date型の日付をバッチファイルに渡す時に、8桁数値へ変換したいのですが、0埋めのやり方が分からずに困っております。 Date型 yyyy/mm/dd 8桁数値 yyyymmdd Private Sub cmdBSubmit_Click() Dim rc As Integer Dim sDate As Date Dim eDate As Date '開始日・終了日処理 sDate = DateAdd("d", -5, txtsDate) eDate = DateAdd("d", 5, txteDate) Debug.Print "----------------------" Debug.Print "開始日-5:" & sDate Debug.Print "終了日+5:" & eDate 'パブリック変数へ、日付格納 sDateP = Year(sDate) & Month(sDate) & Day(sDate) eDateP = Year(eDate) & Month(eDate) & Day(eDate) Debug.Print "----------------------" Debug.Print "開始日:" & sDateP Debug.Print "終了日:" & eDateP rc = MsgBox("開始日 : " & sDate & vbCrLf & _ "終了日 : " & eDate & vbCrLf & _ "抽出を開始します宜しいですか?", vbYesNo + vbQuestion, "確認") If rc = vbYes Then '集計バッチを実行 'MsgBox "実行" Call 抽出 Else '中止 MsgBox "中止" End If End Sub 'パブリック変数へ、日付格納 sDateP = Year(sDate) & Month(sDate) & Day(sDate) eDateP = Year(eDate) & Month(eDate) & Day(eDate) この書き方だと、月・日が一桁の場合、例えば「2013/01/01」だと、”201311”になってしまいます。 これを、"20130101"にしたいのですが、どう書けば宜しいでしょか? 最初から、8桁日付で入力すればよいのでしょうか、入力した日付の前後5日を自動的に増やす必要がある為に上記の仕様にしてます。

  • SQLを教えてください。

    おせわになります。助けてください。 id | nendo | sdate | edate 0 | 2012 | 2012-04-01 | 2013-03-31 1 | 2013 | 2013-04-01 | 2014-03-31 2 | 2014 | 2014-04-01 | 2015-03-31 2 | 2015 | 2015-04-01 | 2016-03-31 といったデーターベースがあります。 2014/03/31 という日付がどの年度の日付なのかを 調べるSQLをどう書けばいいのかわかりません。 SELECT * FROM m_nendo WHERE sdate <= '2014/03/31' and edate >'2014/03/31' といった書き方をしているのですが、思う結果を取れません。 ネットでどういう言葉で検索したらいいのかも・・・わかりません。 書き方をご存知の方、教えて頂けませんか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 片方のテーブルに存在しないレコード取得したい

    OracleのSQL文を教えて下さい。 -tableA- key1,key2 001,1 002,2 002,1 003,2 -tableb- key1,key2 001,1 002,1 取得したいレコード 002,2 003,2 お願いします。

  • MySQLで、日付最大のレコード抽出

    MySQLをJAVAで使っています。 指定キーの中で、一番日付の大きなレコード項目全てを 取り出したいのですが、 下記SQLだと、何も抽出されません。 (今朝、ここで教えて頂いたSQL文です) 何が間違っているのでしょうか? さらに、もっと簡単なSQL文はないでしょうか? SELECT * FROM food WHERE (food_id = 1) AND (food_name = 'みかん') AND (karute_id = (SELECT MAX(date) FROM food WHERE (food_id = 1) AND (food_name = 'みかん'))) 与える検索キー項目は、food_id=1, food_name=みかん foodテーブル例 food_id  food_name   date --------------------------------- 1     みかん    2015-01-01 1     みかん    2015-02-01 1     みかん    null 1     みかん    2015-04-01 2     きんめだい  2015-01-01 2     じんたん   2015-02-01 2     コロッケ   2015-02-01

    • ベストアンサー
    • MySQL
  • MySQLで、日付最大のレコード抽出

    MySQLをJAVAで使っています。 指定キーの中で、一番日付の大きなレコード項目全てを 取り出したいのですが、 下記SQLだと、何も抽出されません。 何が間違っているのでしょうか? さらに、もっと簡単なSQL文はないでしょうか? SELECT * FROM food WHERE (food_id = 1) AND (food_name = 'みかん') AND (food_id = (SELECT MAX(date) FROM food WHERE (food_id = 1) AND (food_name = 'みかん'))) 与える検索キー項目は、food_id=1, food_name=みかん foodテーブル例 food_id  food_name   date --------------------------------- 1     みかん    2015-01-01 1     みかん    2015-02-01 1     みかん    null 1     みかん    2015-04-01 2     きんめだい  2015-01-01 2     じんたん   2015-02-01 2     コロッケ   2015-02-01

    • ベストアンサー
    • MySQL
  • 同一レコード更新時の排他制御

    Oracle9iです。 C/S開発で、VB.NETで画面を開発します。 DBの更新は、画面よりストアドプロシージャを使って行います。 複数ユーザが同一レコードを同時に参照し、同一レコードに対して更新された場合、参照時の更新日時と異なる場合はエラーとするよう設計されています。(つまり、後更新はエラー) この排他チェックロジックを画面側で実装しようとしておりますが、この排他チェックロジックを画面側で実装せずに、Oracleよりエラーレコードを受け取ることによる排他制御を行うことはできないでしょうか? ご教授のほどよろしくお願いいたします。 また、参考サイトあれば、その紹介だけでも助かります。

  • テーブルタブの日付範囲の表示

    アクセス2007を使っています。 テーブルA(tblA)には色々なRecord ID, カスタマーID,日付,データ(M, N, O) が入っています。 クエリA(qryA)で欲しい日付の範囲のデータが抽出できるように日付のフィールドに Between [Enter first date:] And [Enter last date:] を抽出条件に付けました。ここまでは、自分ながらうまくいったと思ったんですが、このクエリAで抽出したデータのサマリーが欲しくて、テーブルタブを使ってクエリAのデータを下記のように要約しようとしました。 (01/01/09~02/28/09のサマリー) カスタマーID        データ           M     N     O    1      1     1         2      1     2    3      2           1 ところがエラーメッセージが The Microsoft Office Access database engine doesn't recognize'[Enter first date:]'as a valid field name or expression. と出てきます。 そこで SQLビューを見ると TRANSFORM Count(qryA.[Record ID]) AS [Record IDOfCount] SELECT qryA.[カスタマーID], qryA.[日付], Count(qryA.[Record ID]) AS [Total Of Record ID] FROM qryA GROUP BY qryA.[カスタマーID] PIVOT qryA.[データ]; となっていました。 WHERE文がいるんじゃないかと思って WHERE ((tblA.日付) Between [Enter first date:] And [Enter last date:])など入れてみましたが、さっぱりうまくいきません。 QSLも先日勉強し始めたばかりで、今一歩何が悪いのか分かりません。 どなたかどうやって日付範囲のあるテーブルタブの作り方を教えていただけませんでしょうか?

  • Transact-SQLで順番に日付をセットするには?

    主キーが存在しないうえに、まったく同じデータが1万件件あります。 そのデータに対して日付項目だけ 2009/1/1、2009/1/2...といった感じで順番にUPDATEをかけたいのですが Transact-SQLで実装するにはどうすればいいでしょうか?