在Oracle中,有一种直接的方法可以获得一周的第一天吗?
例如,今天的日期是12/4/2012。如果我跑: 从双重中选择to_char(sysdate,'WW'); 它返回49作为周数。
我想做的是第一天以某种方式返回2012年12月2日...给予第49周(假设星期日为一周的第一天)。
有什么想法吗?在此先感谢您的帮助!
答案 0 :(得分:6)
试试这个:
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
答案 1 :(得分:3)
如果你有日期,而不仅仅是周数,你可以试试这个:
to_char(theDate, 'D')
像这样:
SELECT theDate - to_char(theDate, 'D') + 1 as BeginOfWeek,
theDate,
theDate - to_char(theDate, 'D') + 7 as EndOfWeek
FROM TableName
答案 2 :(得分:3)
试试这个,
select
next_day(trunc(to_date(in_year,'yyyy'),'yyyy') -1,'Mon') + (7 * (in_week - 1))
from dual;
答案 3 :(得分:1)
我还不能对问题发表评论,所以我会再添加一个。但这是基于@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'
因为我们已经超过一年,所以我们也需要检查一年。
答案 4 :(得分:0)
使用截断函数@Justin,我认为这就是你想要的:
select trunc(to_date('2012-01-01', 'YYYY-MM-DD') + (49 - 1) * 7, 'WW') from dual;
答案 5 :(得分:0)
我最终这样做了:
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;