在Oracle中,有沒有一種簡單的方法可以獲得每週的第一天給定的一週數?從週數獲得第一週的第一天
例如,今天的日期是12/4/2012。如果我運行: 從dual中選擇to_char(sysdate,'WW'); 它返回49週數。
我想要做的是以某種方式返回2012年12月2日的第一天...給出第49周(假設星期天爲一週的第一天)。
任何想法?預先感謝任何幫助!
在Oracle中,有沒有一種簡單的方法可以獲得每週的第一天給定的一週數?從週數獲得第一週的第一天
例如,今天的日期是12/4/2012。如果我運行: 從dual中選擇to_char(sysdate,'WW'); 它返回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
使用使用TRUNC函數@Justin,我認爲這是你想要的東西:
select trunc(to_date('2012-01-01', 'YYYY-MM-DD') + (49 - 1) * 7, 'WW') from dual;
謝謝你的迴應JDunkerley。但是,看起來這並不總是奏效。例如,如果我將2008年插入腳本,它看起來像:select trunc(to_date('2008-01-01','YYYY-MM-DD')+(49 - 1)* 7,'WW' )從雙重;這將返回12/2/2008,這是一個星期二 – user1134307
如果你有約會,而不僅僅是週數,你可以試試這個:
to_char(theDate, 'D')
像這樣:
SELECT theDate - to_char(theDate, 'D') + 1 as BeginOfWeek,
theDate,
theDate - to_char(theDate, 'D') + 7 as EndOfWeek
FROM TableName
真棒,簡單的解決方案:) – Shakti
我不能在問題尚未置評,所以我再添一個。但這是基於@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'
因爲我們跨越一年多,我們需要檢查今年也。
試試這個,
select
next_day(trunc(to_date(in_year,'yyyy'),'yyyy') -1,'Mon') + (7 * (in_week - 1))
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;
哇,非常光滑......謝謝! – user1134307