2011-06-22 13 views
0

DWにTIMEディメンションがあり、年の季節を記入するキャンプを追加したいとします。 は、私はこのような何かをしたい:SQLで年の季節別に日付を区切る問題

create or replace 
PROCEDURE "PROC_UPDATE_SEASON" 

IS 
CURSOR curs IS 
SELECT * FROM indw.time FOR UPDATE; 
cur_d NUMBER; 
cur_m NUMBER; 
start_d NUMBER; 
start_m NUMBER; 
end_d NUMBER; 
end_m NUMBER; 
cur_Date DATE;  

BEGIN 
FOR cs IN curs 
LOOP 
    cur_d := to_number(to_char(cs.time_DAY,'dd')); 
    cur_m := to_number(to_char(cs.time_DAY,'mm')); 
    cur_date:= cs.time_DAY; -- this is my date dd-mm-yyyy or dd/mm/yyyy 


    if ((cur_date in format dd/mm is >= 21/12 and <=31/12) OR cur_date>=01/01 and <=20/03) 
    UPDATE time t set t.time_SEASON = 'Winter' WHERE CURRENT OF curs; 
    else if cur_date_in format dd/mm is between a date and another then it's Spring) 
     -- and so on ... 
    END LOOP; 
END; 

この使用してTO_CHARを達成し、TO_DATEする方法はありますか?私がしようとしますが、常にエラーを取得:(月と日を比較し、別々に途方もないと、IMO、愚かな仕事になります。

あなたは私にいくつかのヒントを与えてもらえてる?

私は本当に好きただ一つの使用何かをDD/MM < = another_date_with_only_day_and_month

答えて

5

カーソルとループは必要ない:

update indw.time 
set t.time_SEASON = case 
         when to_char(time_DAY,'MMDD') between '1221' and '1231' 
         or to_char(time_DAY,'MMDD') between '0101' and '0320' 
         then 'Winter' 
         when ... 
        end 

がベターはまだ、オラクル11GにあなたがそのCASE式に基づいてテーブルに仮想列を追加することができるように、すべての行の自動正式に正しいtime_seasonを更新する必要はありませんでした。

+0

ありがとうございます。私はOWBでこの手続き、事後手続きを試してみるつもりです。私は急いでいるからです。しかし、できるだけ早くあなたが言及した最後のオプションを試してみたいと思います。 – neverMind

+0

問題は、to_char(time_DAY、 'DD-MM')> = '21 -12'doesn'tは動作しますが、どちらの場合でも、日付と比較する必要があることです。select to_date(to_char time_day、 'dd-mm')、 'dd-mm'これはすでに動作しています:to_Ddate(to_char(time_day、 'dd-mm-yyyy')、 'dd-mm-yyyy'どうすればこれを克服できますか? – neverMind

+1

これは、 'MMDD'という形式を使用しているため、日付と同じ方法で並べ替える文字列になります。 –

0

オラクルにオプションを提供するためのアクセス権がありません。しかし、私はアドバイスがあります:
- このコードが頻繁に実行される場合、文字列の変換や文字列の比較には注意が必要です。数値処理に比べて通常はひどく遅くなります
- 最も単純であるものは何でも一緒に行く、とパフォーマンスをネジ:)

ことを念頭に置いて、私はEXTRACTを使用したい... (私が言ったように私はこれをテストすることはできません、注意してください)

UPDATE indw.time 
SET t.time_SEASON = CASE 
         WHEN EXTRACT(MONTH, time_DAY) < 3 THEN 'Winter' 
         WHEN EXTRACT(MONTH, time_DAY) = 3 THEN 
          CASE WHEN EXTRACT(DAY, time_DAY) <= 20 THEN 'Winter' ELSE 'Spring' END 
         WHEN EXTRACT(MONTH, time_DAY) < 6 THEN 'Spring' 
         WHEN EXTRACT(MONTH, time_DAY) = 6 THEN 
          CASE WHEN EXTRACT(DAY, time_DAY) <= 20 THEN 'Spring' ELSE 'Summer' END 
         WHEN EXTRACT(MONTH, time_DAY) < 9 THEN 'Summer' 
         WHEN EXTRACT(MONTH, time_DAY) = 9 THEN 
          CASE WHEN EXTRACT(DAY, time_DAY) <= 20 THEN 'Summer' ELSE 'Autumn' END 
         WHEN EXTRACT(MONTH, time_DAY) < 12 THEN 'Autumn' 
         WHEN EXTRACT(MONTH, time_DAY) = 12 THEN 
          CASE WHEN EXTRACT(DAY, time_DAY) <= 20 THEN 'Autumn' ELSE 'Winter' END 
         END 
+1

'extract'呼び出しは' EXTRACT(MONTH FROM time_day) 'でなければなりません。 – Allan