2013-09-23 2 views
0

Сценарий, у меня есть given_date в YYYY-WW формате, т.е., 201243 и current_week является 201338дата Вычесть в YYYY-WW формате

я также 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_week и week_number, которые дали бы вам рассчитанный ответ, где неделя будет> 53, будет проблема, поэтому вы решаете, как относиться к значениям несколько иначе.

Фактически вы обрабатываете это как число, где первые четыре цифры находятся в базе 10, а последние два и одно значение в базе 53. Добавив 48 к номеру недели, вы видите, прошлое 53, и если это произойдет, вы начнете снова на 1-й неделе следующего года. Добавление 48 в 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 

Вы не можете использовать WW непосредственно в to_date, так что я в первый же день на этой неделе; в первый день 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 затем ... ... конец, если; – Guru

+0

- здесь я не знал, как добавить Given_Date + Given_weeks_to_add , поэтому я написал как Process_date = diff_yyyyww (current_week, given_date); если 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

привет @Alex, если я дам given_date: = '201255'; этот запрос дает результат как 201401, на самом деле есть 52 недели в году и 201255 невозможно .... исправьте меня, если я ошибаюсь – Guru

Смежные вопросы