我有两列,如下所示。
我使用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周。我很感激上述公式的任何帮助
答案 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)