在 Oracle 中,是否有一种简单的方法可以在给定周数的情况下获得一周的第一天?
例如,今天的日期是 2012 年 12 月 4 日。如果我运行: select to_char(sysdate,'WW') from dual; 它返回 49 作为周数。
我想做的是以某种方式返回 2012 年 12 月 2 日的第一天......给定第 49 周(假设星期天是一周的第一天)。
有任何想法吗?提前感谢您的帮助!
试试这个:
select next_day(max(d), 'sun') requested_sun
from (select to_date('01-01-2012', 'dd-mm-yyyy') + (rownum-1) d from dual connect by level <= 366)
where to_char(d, 'ww') = 49-1;
只需将您的年份to_date('01-01-2012'
和周数设置为 1即可49-1
。
2008 年第 49 周的星期天?
SQL> select next_day(max(d), 'sun') requested_sun
2 from (select to_date('01-01-2008', 'dd-mm-yyyy') + (rownum-1) d from dual connect by level <= 366)
3 where to_char(d, 'ww') = 49-1;
REQUESTED
---------
07-DEC-08
和 2012
SQL> select next_day(max(d), 'sun') requested_sun
2 from (select to_date('01-01-2012', 'dd-mm-yyyy') + (rownum-1) d from dual connect by level <= 366)
3 where to_char(d, 'ww') = 49-1;
REQUESTED
---------
02-DEC-12
试试这个,
select
next_day(trunc(to_date(in_year,'yyyy'),'yyyy') -1,'Mon') + (7 * (in_week - 1))
from dual;
如果你有日期,而不仅仅是周数,你可以试试这个:
to_char(theDate, 'D')
像这样:
SELECT theDate - to_char(theDate, 'D') + 1 as BeginOfWeek,
theDate,
theDate - to_char(theDate, 'D') + 7 as EndOfWeek
FROM TableName
我还不能对问题发表评论,所以我会添加另一个问题。但这是基于@Dazzals 的回答。他的解决方案不适用于第一周和 ISO 周。如果一周的第一天不是星期天,它也不起作用,这可以由 NLS_SETTINGS 控制。
这个可以:
SELECT MIN(D)
FROM (SELECT TO_DATE('01-01-2013', 'dd-mm-yyyy') + (ROWNUM-10) D, ROWNUM R
FROM DUAL
CONNECT BY LEVEL <= 376)
WHERE TO_CHAR(D,'IYYYIW') = '201301'
因为我们跨越一年多,所以我们也需要检查年份。
使用 @Justin 使用的 trunc 函数,我认为这就是你想要的:
select trunc(to_date('2012-01-01', 'YYYY-MM-DD') + (49 - 1) * 7, 'WW') from dual;
我最终这样做了:
function getFirstDayOfWeek(y in binary_integer, w in binary_integer) return date
is
td date;
begin
td:=TO_DATE(TO_CHAR(y)||'0101', 'YYYYMMDD');
for c in 0..52
loop
if TO_NUMBER(TO_CHAR(td, 'IW'))=w then
return TRUNC(td, 'IW');
end if;
td:=td+7;
end loop;
return null;
end;