0

情况是,我有 yyyy-ww 格式的给定日期,即 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 并用 (48+week_number) 进行检查

它工作正常...

我需要这个"48"的理由,如果我添加数字 48 我会得到预期的结果......

4

1 回答 1

1

WW为您提供一年中的第几周 (1-53),其中第 1 周从一年的第一天开始,一直持续到一年的第七天

今天是201338。如果您将其视为一个数字并添加 50,您将得到201388,并且显然没有第 88 周。given_week和的任何组合week_number都会给您一个计算出的答案,其中周似乎 > 53 将是一个问题,所以你正在决定何时以不同的方式处理这些值。

实际上,您将 this 视为一个数字,其中前四位数字以 10 为基数,后两位数字以 53 为基数。通过将 48 添加到周数,您可以看到它是否超过 53,如果您是否会在第二年的第 1 周重新开始。将 48 添加到201388201436,这看起来是一个更明智的值。它有效地跳过了 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

于 2013-09-23T12:01:44.233 回答