2013-09-23 200 views
0

的情況是,我在YYYY-WW格式given_date,即201243和current_week是201338減去日期

我也有一個WEEK_NUMBER說50,這表明50周...

,那麼現在我這50元的數週內新增至201243,使得它給我的結果是201341,而邏輯是我應檢查其是否大於201338

我寫了一段代碼...爲這...

Process_date= diff_yyyyww(current_week,given_date); 

if Process_date>(48+week_number) 
... 
... 

,而不是加到50,如果我發現(在given_date & current_week之間的差)與(48 + WEEK_NUMBER)

其工作正常檢查......

我需要爲這個「48理由「,如果我添加數字48我得到預期的結果...

+0

日期沒有「格式」。該列有哪些數據類型? –

+0

數字(6),我不能使用日期數據類型在這裏...日期在這裏是年周格式... – Guru

+0

48是'0'字符的神奇數字。也許有一些從int到char的轉換以某種方式發生? – Dariusz

回答

1

WW給你week of year (1-53) where week 1 starts on the first day of the year and continues to the seventh day of the year

今天是201338。如果你將它視爲一個數字並將其加上50,那麼你會得到201388,並且顯然沒有第88周。任何given_weekweek_number的組合都可以給你一個計算出的答案,其中一週看起來> 53一個問題,所以你決定什麼時候處理值有點不同。

實際上,你認爲這是一個數字,其中前四位數字以10爲基數,最後兩位數字和基數爲53的單個值。通過在週數中加上48來確定它是否環繞過去53年,如果是這樣,你會在第二年的第一週再次開始。將0123添加到201388中給出201436,這看起來更爲合理。它在54到00之間的無效週數中被有效地跳過。

所以基本上你使用48是因爲48 + 53 = 101,我想。

隨着你的值,process_date看起來應該是做to_number('201338') - to_number('201243'),這是95,但不大於(48 + 50),所以它必須做別的。我並不完全遵循你的邏輯,或者當前日期適合於圖片的地方。

我懷疑這是行不通的,如果week_number本身比53更大,因爲你似乎沒有試圖處理它包裝兩年結束。

您可以將其轉換爲名義日期,以天爲單位添加所需的週數並轉換回來。這可能並不總是一致,雖然,這將需要一些測試,以確保它符合您的期望,特別是如果你「丟失」一個星期的地方:

var given_date varchar2(6); 
var week_number number; 
exec :given_date := '201243'; 
exec :week_number := 50; 

select to_char(to_date(substr(:given_date, 1, 4) || '0101', 'YYYYMMDD') 
    + (to_number(substr(:given_date, 5, 2)) * 7) + (:week_number * 7) 
    , 'YYYYWW') as answer 
from dual; 

ANSWER 
------ 
201341 

您不能直接在to_date使用WW所以我基本上是在那周選擇的第一天; 201201的第一天是2012-01-01,並增加了43周,給出2012-10-28。再增加50周,得到2013-10-13,這是在201341周。

+0

問題詳細解釋實際上流程應該像是假設, current_week = 201338; Given_Date = 201240; Given_weeks_to_add = 50; - 恆定 如果(Given_Date + Given_weeks_to_add)> current_week 然後 ... ... END IF; – Guru

+0

- 這裏我不知道如何添加Given_Date + Given_weeks_to_add ,所以我寫成像 Process_date = diff_yyyyww(current_week,given_date); if Process_date>(48 + week_number) ... ... end if; 其中 diff_yyyyww(in_yyyyww_1,in_yyyyww_2); 做了以下操作 tmp_val_1 NUMBER; tmp_val_2 NUMBER; BEGIN tmp_val_1:= FLOOR(in_yyyyww_1/100)* 52 + MOD(in_yyyyww_1,100); tmp_val_2:= FLOOR(in_yyyyww_2/100)* 52 + MOD(in_yyyyww_2,100); RETURN(tmp_val_1 - tmp_val_2); – Guru

+0

hi @Alex如果我給了given_date:='201255';這個查詢會給出201401, 的輸出,實際上一年有52周&201255是不可能的。 糾正我,如果我錯了 – Guru