以yyyy-ww格式减去日期

时间:2013-09-23 10:36:42

标签: oracle

情节是,我以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号,我就会得到预期的结果......

1 个答案:

答案 0 :(得分: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_weekweek_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周。