0

Oracle 11g データベースのカレンダー テーブルに次のデータを入力する必要があります。

テーブルには 2000 年以降のデータが既に入力されています。ここで、1994 年にさかのぼって、since_2000 列に負の数値を入力する必要があります。2000年以降の週と2000年以降の四半期を除いて、すべてを把握したと思います.

EDIT1: 200 年からの 1 週間と 2000 年からの 1 か月がまだめちゃくちゃになっていることに気付きました。2000 年以降の四半期は、以下の回答を使用すると良さそうです。クエリを最新のものに更新しています。

EDIT2: trunc() がないため、機能していませんでした。現在は正常に動作しています。最新のクエリが更新されました。

これは私がそれを行うために使用しているものです:

/* Formatted on 2/1/2013 11:54:27 AM (QP5 v5.227.12220.39724) */
CREATE OR REPLACE PROCEDURE populate_d_calendar (start_date     IN DATE,
                         end_date       IN DATE)
AS
BEGIN
   INSERT INTO d_calendar (calendar_date,
               week_number,
               week_year,
               day_since_2000,
               week_since_2000,
               month_since_2000,
               quarter_since_2000,
               week_of_month)
      SELECT dt,                                                        --Date
         TO_CHAR (dt,
              'ww'),                                --Week in the year
         TO_CHAR (dt,
              'yyyy'),                                          --Year
         TO_CHAR (dt - end_date),                         --Day Since 2000
         TRUNC (TO_CHAR (dt - end_date) / 7),            --Week Since 2000
         TRUNC (MONTHS_BETWEEN (dt,
                    end_date)),             --Month Since 2000
         CASE
        WHEN TO_CHAR (dt,
                  'MMDD') >= '0101'
         AND TO_CHAR (dt,
                  'MMDD') < '0401'
        THEN
             0
           +   4
             * TRUNC (  MONTHS_BETWEEN (TO_DATE (   '0101'
                             || TO_CHAR (dt,
                                     'yyyy'),
                             'mmddyyyy'),
                        TO_DATE ('01Jun2000'))
                  / 12)                                       --q1
        WHEN TO_CHAR (dt,
                  'MMDD') >= '0401'
         AND TO_CHAR (dt,
                  'MMDD') < '0701'
        THEN
             1
           +   4
             * TRUNC (  MONTHS_BETWEEN (TO_DATE (   '0101'
                             || TO_CHAR (dt,
                                     'yyyy'),
                             'mmddyyyy'),
                        TO_DATE ('01Jun2000'))
                  / 12)                                       --q2
        WHEN TO_CHAR (dt,
                  'MMDD') >= '0701'
         AND TO_CHAR (dt,
                  'MMDD') < '1001'
        THEN
             2
           +   4
             * TRUNC (  MONTHS_BETWEEN (TO_DATE (   '0101'
                             || TO_CHAR (dt,
                                     'yyyy'),
                             'mmddyyyy'),
                        TO_DATE ('01Jun2000'))
                  / 12)                                       --q3
        WHEN TO_CHAR (dt,
                  'MMDD') >= '1001'
         AND TO_CHAR (dt,
                  'MMDD') <= '1231'
        THEN
             3
           +   4
             * TRUNC (  MONTHS_BETWEEN (TO_DATE (   '0101'
                             || TO_CHAR (dt,
                                     'yyyy'),
                             'mmddyyyy'),
                        TO_DATE ('01Jun2000'))
                  / 12)                                       --q4
         END
        quarters_since_2000,                      --Quarter Since 2000
         TO_CHAR (dt,
              'w')                                 --Week of the month
    FROM (SELECT start_date + LEVEL - 1 dt
        FROM DUAL
          CONNECT BY LEVEL <= end_date - start_date + 1);
END;
/
4

3 に答える 3

1

これは、2013年1月1日から今日までの私のバージョンのカレンダーテーブルです。月数、四半期数、日数などをどのように挿入する必要があるのか​​わかりません...毎年または1回の合計月数を表示する必要がありますか?これらの計算を自分で追加するか、投稿に必要な出力を追加して明確にすることができます。以下のaddlクエリ/コメントを参照してください。

-- Days,weeks, quarters from 1/1/2013 --
SELECT start_date                               -- 1/1/2013 --
    , TRUNC(start_date, 'iw')                  wk_starts  
    , TRUNC(start_date, 'iw') + 7 - 1/86400    wk_ends
    , TO_NUMBER (TO_CHAR (start_date, 'IW'))   ISO_wk#  
    , TO_NUMBER (TO_CHAR (start_date, 'Q'))    Quarters  
 FROM
  (
   SELECT TRUNC(SYSDATE, 'Y')-1 + LEVEL AS start_date  
     FROM dual
   CONNECT BY LEVEL <= 
  (  -- replace this part to go back to 1994 - see below --
  SELECT TRUNC(ADD_MONTHS (SYSDATE, 12), 'Y')-TRUNC(SYSDATE, 'Y') "Num of Days in 2013"   
    FROM dual
  )
)
/

START_DATE  WK_STARTS   WK_ENDS                 ISO_WK#     QUARTERS
---------------------------------------------------------------------
1/1/2013    12/31/2012  1/6/2013 11:59:59 PM    1           1
1/2/2013    12/31/2012  1/6/2013 11:59:59 PM    1           1
......
2/19/2013   2/18/2013   2/24/2013 11:59:59 PM   8           1
2/20/2013   2/18/2013   2/24/2013 11:59:59 PM   8           1
......
3/10/2013   3/4/2013    3/10/2013 11:59:59 PM   10          1
3/11/2013   3/11/2013   3/17/2013 11:59:59 PM   11          1
.......

-- 6971 days from 1/1/1994 till today - 2/1/2013 --
SELECT TRUNC(SYSDATE) - TRUNC(ADD_MONTHS (SYSDATE, -12*19), 'Y') "Num of Days from 1994"
  FROM dual
/

-- 4780 days from 1/1/2000 till today - 2/1/2013 --
SELECT TRUNC(SYSDATE) - TRUNC(ADD_MONTHS (SYSDATE, -12*13), 'Y') "Num of Days from 2000"
  FROM dual
/

-- 156 Months between from 2000 toll today --
SELECT MONTHS_BETWEEN(TRUNC(SYSDATE), TRUNC(ADD_MONTHS (SYSDATE, -12*13))) mo_btw_2000_till_today 
  FROM dual
/

-- Number of weeks btw. 2 dates -- 
SELECT to_char(sysdate, 'WW') - to_char(sysdate-30, 'WW') number_of_weeks FROM dual
/

これはあなたが望むものと正確に一致しないかもしれません...あなたをもっと助けるために、私はあなたのクエリの実際の期待される出力を見る必要があります。助けようとしているだけです...

于 2013-02-01T19:22:35.943 に答える
1

週間で、次のいずれかの方法に従うことができます。

http://searchoracle.techtarget.com/answer/Calculating-weeks-between-two-dates

どのルールがあなたにとってより有用であるかに依存するため

Quartersでは、これを使用します。

case 
         WHEN TO_CHAR (dt,'MMDD') >= '0101' and TO_CHAR (dt,'MMDD') < '0401' then  0 + 4 * trunc(months_between( to_date('0101' || to_char(dt,'yyyy'),'mmddyyyy'),to_date('01Jun2000' )) /12)   --q1
         WHEN TO_CHAR (dt,'MMDD') >= '0401' and TO_CHAR (dt,'MMDD') < '0701' then  1 + 4 * trunc(months_between( to_date('0101' || to_char(dt,'yyyy'),'mmddyyyy'),to_date('01Jun2000' )) /12)  --q2
         WHEN TO_CHAR (dt,'MMDD') >= '0701' and TO_CHAR (dt,'MMDD') < '1001' then  2 + 4 * trunc(months_between( to_date('0101' || to_char(dt,'yyyy'),'mmddyyyy'),to_date('01Jun2000' )) /12)  --q3
         WHEN TO_CHAR (dt,'MMDD') >= '1001' and TO_CHAR (dt,'MMDD') <= '1231' then 3 + 4 * trunc(months_between( to_date('0101' || to_char(dt,'yyyy'),'mmddyyyy'),to_date('01Jun2000' )) /12)   --q4
         end         quarters_since_2000,  
于 2013-02-01T17:18:55.327 に答える
1

私はあなたが他の人と同じように浮動小数点を求めていると思うので、多分:

TO_CHAR (dt - end_date)/7 week_since_2000

(MONTHS_BETWEEN (dt,
            end_date)/3) quarter_since_2000
于 2013-02-01T16:51:21.603 に答える