计算oracle中两个日期之间的周数

时间:2016-04-19 12:36:44

标签: oracle

我使用以下查询查找两个日期之间的周数:

select  count(week_id) 
from fw 
where week_begin_date >= '2015-01-01' 
and  week_end_date <= '2015-12-31';

预期结果应为53,但实际结果为51。

请帮忙解决这个问题。

3 个答案:

答案 0 :(得分:3)

你不能只使用一年中的一周功能吗?如果需要减去......

 select to_char(to_date('12/31/2015','MM/DD/YYYY'),'WW') from dual;


select To_Number(to_char(to_date('12/31/2015','MM/DD/YYYY'),'WW')) - 
       To_number(to_char(to_date('01/01/2015','MM/DD/YYYY'),'WW')) +1
from dual;

我们必须添加+1,因为周数从1开始而不是0。

enter image description here

现在也许您正在使用ISO周格式IW而不是WW

WW:一年中的一周(1-53),第一周从一年的第一天开始,一直持续到一年的第七天。

IW:基于ISO标准的一年中的一周(1-52或1-53)。

答案 1 :(得分:1)

我知道这是一个非常古老的线程,但我今天使用了此代码的修改版本,我认为可能对其他人有益。我的修改解决了小数周问题并删除了减号:

SELECT 
  CEIL(
       ABS(
            (  
               TO_DATE('20160101','YYYYMMDD')
             - TO_DATE('20161231','YYYYMMDD')
            ) / 7 
           )
      ) AS DT
FROM DUAL

ABS 函数取两个日期相减的结果的绝对值,从而消除减号(如果存在)(我改变了日期的顺序来演示这一点)。 CEIL 函数将任何小数周向上舍入到下一个整周(我将年份更改为 2016 以证明这一点 - CEIL 在逻辑上等同于 Excel 中的 ROUNDUP 函数)。注意:我们必须首先应用 ABS 函数(内括号),因为 CEIL 也会对负数进行四舍五入,如果在 CEIL 之后应用 ABS,这实际上会将周数向下四舍五入。这个计算的结果是 53(减去日期返回大约 -52.142857,ABS 去除减号,CEIL 向上取整为 53)。

我希望这最终对某人有用。谢谢。

答案 2 :(得分:0)

你试过这个:

SELECT 
  REPLACE(( 
     to_date('20151231','yyyymmdd') - to_date('20150101','yyyymmdd')
  )/7, '-', '')
FROM
  DUAL