oracle sql pl / sql如何减去日期/工作周

时间:2015-05-22 01:07:37

标签: sql oracle date plsql

我有两列,如下所示。

我使用ww1-ww2计算了差异列。但我在前两行没有得到正确的结果。我该如何修改我的计算?

我尝试了to_date(ww1)-to_date(ww2),但它没有用:(

ww1     ww2     difference
201401  201347  54
201401  201346  55
201405  201404  1
201406  201405  1
201408  201405  3
201409  201408  1
201409  201406  3
201409  201407  2
201410  201409  1
201420  201419  1
201425  201424  1
201427  201426  1
201428  201426  2

================== update 1 =========

ww1和ww2的日期为YYYYWW格式,其中YYYY为年,WW为工作周

我的差异栏应该显示工作周差异。所以在第1排6,考虑到任何一年的52周。

============ UPDATE2 ==================

我看了下面的答案,我觉得这就是我需要的。这就是我在Excel中编程的方式,如果有人能提供SQL解决方案,我更愿意。

如果(子串(ww1,4)==子(ww2,4),WW1-WW2,(子串(ww1,4)-substring(ww2,4))* 53 +子(ww1,5,6) -substring(ww2,5,6))

where substring(ww1,4)给我前ww1的前4个字符和子串(ww1,5,6)给我ww1的第5和第6个字符

我需要这样做,因为每年我有53周。我很感激上述公式的任何帮助

2 个答案:

答案 0 :(得分:4)

如果您尝试将这些视为日期,请使用YYYYWW格式,然后您需要转换回日期。这样做会很好:

select to_date(ww1, 'YYYYWW') - to_date(ww2, 'YYYYWW')

但是,这是不允许的。所以:

select ( (to_date(substr(ww1, 4) || '-01-01', 'YYYY-MM-DD') + 7 * to_number(substr(ww1, 5, 2)) ) -
         (to_date(substr(ww2, 4) || '-01-01', 'YYYY-MM-DD') + 7 * to_number(substr(ww2, 5, 2))
       ) as DiffInDays

如果你想要几周的差异,那么除以7。

作为注释:您应该将周存储为一周开始(或结束)的日期。它使这种操作更容易

编辑:

为了使这个工作多年没有分数,你需要确保几周从同一天开始。这是一种方法:

select ( (next_day(to_date(substr(ww1, 4) || '-01-01', 'YYYY-MM-DD'), 'Sun') + 7 * to_number(substr(ww1, 5, 2)) ) -
         (next_day(to_date(substr(ww2, 4) || '-01-01', 'YYYY-MM-DD'), 'Sun') + 7 * to_number(substr(ww2, 5, 2))
       ) as DiffInDays

我担心这可能会在某些年份出现一个错误。坦率地说,我(也不是网络上的任何其他人)知道你对某一年的第n周的定义。你需要应用你的定义来获得一周的第一天,然后减去天数。

答案 1 :(得分:1)

根据您的第二次更新,我的理解是您正在尝试计算两个日期之间的星期差异。其中一种可能的解决方案(每年给出53周):

English CA

Fiddle进行测试