情节是,我以yyyy-ww格式给出了_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和amp_ current_week之间的差异)并检查它(48 + week_number)
工作正常......
我需要证明这个“48”,如果我加上48号,我就会得到预期的结果......
答案 0 :(得分:1)
今天是201338
。如果您将其视为一个数字并将其加50,那么您将获得201388
,并且显然没有第88周。given_week
和week_number
的任何组合都可以为您提供计算出的答案,其中一周似乎是> 53将是一个问题,所以你决定何时对这些值的处理方式有所不同。
实际上,您将此视为一个数字,其中前四位数字位于基数为10,最后两位数字为基数53.通过在周数中添加48,您可以看到它是否包裹在过去53如果确实如此,你将在下一年的第1周重新开始。向201388
添加48会产生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
周。