我使用以下查询查找两个日期之间的周数:
select count(week_id)
from fw
where week_begin_date >= '2015-01-01'
and week_end_date <= '2015-12-31';
预期结果应为53,但实际结果为51。
请帮忙解决这个问题。
答案 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。
现在也许您正在使用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