WW
为您提供一年中的第几周 (1-53),其中第 1 周从一年的第一天开始,一直持续到一年的第七天。
今天是201338
。如果您将其视为一个数字并添加 50,您将得到201388
,并且显然没有第 88 周。given_week
和的任何组合week_number
都会给您一个计算出的答案,其中周似乎 > 53 将是一个问题,所以你正在决定何时以不同的方式处理这些值。
实际上,您将 this 视为一个数字,其中前四位数字以 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),所以它必须在做其他事情。我并没有完全遵循您的逻辑,或者当前日期适合图片的位置,真的。
我怀疑如果 53 本身大于 53,这将不起作用week_number
,因为您似乎并没有试图在两年结束时处理它。
您可以改为转换为名义日期,添加所需的周数(以天为单位),然后转换回来。不过,这可能并不总是一致的,它需要进行一些测试以确保它符合您的期望,尤其是在您在某个地方“失去”一周的情况下:
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
直接在 a 中使用,to_date
所以我基本上选择了那一周的第一天;201201
是的第一天2012-01-01
,再加上 43 周2012-10-28
。再加上 50 周,即2013-10-13
一周201341
。