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
.
Даты не имеют «формат». Какой тип данных имеет этот столбец? –
номер (6), я не могу использовать дату данные типа здесь ... дата здесь в формате года неделя ... – Guru
48 - волшебное число символов '0'. Может быть, есть какое-то преобразование из int на char, что-то происходит? – Dariusz