2012-12-04 87 views
2

在Oracle中,有沒有一種簡單的方法可以獲得每週的第一天給定的一週數?從週數獲得第一週的第一天

例如,今天的日期是12/4/2012。如果我運行: 從dual中選擇to_char(sysdate,'WW'); 它返回49週數。

我想要做的是以某種方式返回2012年12月2日的第一天...給出第49周(假設星期天爲一週的第一天)。

任何想法?預先感謝任何幫助!

回答

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 
+0

哇,非常光滑......謝謝! – user1134307

0

使用使用TRUNC函數@Justin,我認爲這是你想要的東西:

select trunc(to_date('2012-01-01', 'YYYY-MM-DD') + (49 - 1) * 7, 'WW') from dual; 
+0

謝謝你的迴應JDunkerley。但是,看起來這並不總是奏效。例如,如果我將2008年插入腳本,它看起來像:select trunc(to_date('2008-01-01','YYYY-MM-DD')+(49 - 1)* 7,'WW' )從雙重;這將返回12/2/2008,這是一個星期二 – user1134307

3

如果你有約會,而不僅僅是週數,你可以試試這個:

  • 讓您的日期與星期幾號:to_char(theDate, 'D')
  • 減去你的日期加上1的數字,你就會得到那周的星期天。
  • 加7,你會得到一週的結束日期(星期六)。

像這樣:

SELECT theDate - to_char(theDate, 'D') + 1 as BeginOfWeek, 
     theDate, 
     theDate - to_char(theDate, 'D') + 7 as EndOfWeek 
FROM TableName 
+0

真棒,簡單的解決方案:) – Shakti

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' 

因爲我們跨越一年多,我們需要檢查今年也。

3

試試這個,

select 
    next_day(trunc(to_date(in_year,'yyyy'),'yyyy') -1,'Mon') + (7 * (in_week - 1)) 
from dual; 
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;