SQL> select trunc(sysdate,'yyyy')+47*7-to_char(trunc(sysdate,'yyyy'),'d')+1 from dual;TRUNC(SYSD
----------
23-11月-03SQL> 
当前是2003年的第47周,星期天为一周的开始
上面返回的是第47周 星期天的日期,如果要返回星期一的
需要
select trunc(sysdate,'yyyy')+47*7-to_char(trunc(sysdate,'yyyy'),'d')+2 from dual;

解决方案 »

  1.   


    小于当前日期的:
    select NEXT_DAY(sysdate,'星期一')-(TO_CHAR(NEXT_DAY(sysdate,'星期一'),'WW') -47)*7 from dual;
    大于当前日期的:
    select NEXT_DAY(sysdate,'星期一')-(TO_CHAR(NEXT_DAY(sysdate,'星期一'),'WW') -47)*7 from dual;
    上面的语句只对本年内的是正确的。
      

  2.   

    SORRY,上面写错了,不管小于当前日期还是大于当前日期都一样,同一条语句。
      

  3.   

    而且trunc(sysdate,'yyyy')得到的肯定是1月1日,那樣最後的結果還是有問題
      

  4.   

    SQL> select to_date('2003-1-1','yyyy-mm-dd') + 45*7 from dual ;TO_DATE('2
    ----------
    2003-11-12
      

  5.   

    2003年45周的周一SQL> select trunc(sysdate,'yyyy')+45*7-to_char(trunc(sysdate,'yyyy'),'d')+2 from dual;TRUNC(SYSDATE,'YYYY
    -------------------
    2003-11-10 00:00:00有什么不对吗?
      

  6.   

    这个可以:
    select NEXT_DAY(sysdate,'星期一')-(TO_CHAR(NEXT_DAY(sysdate,'星期一'),'WW') -47)*7 from dual;
      

  7.   

    bzszp(SongZip) 的差不多對了,但是我需要的是自己定義時間,而且我們實際用的都是iw,與ww不同。不過還是要感謝你,熟你的啟發,寫了個函數。
    function  getweekday(
    p_week in varchar2,
    p_flag in varchar2 default 'IW',
    p_start_date in varchar2 default 1) --1為星期日
    return varchar2
    as
      v_start_day varchar2(30) := '';
      v_flag  varchar2(2);--判斷是iw 還是 ww
    begin if  UPPER(p_flag)='IW'  then
         v_flag:=7;
       else 
         v_flag:=0;
     end if;  select to_date(substr(p_week,1,4)||'01'||'01','yyyymmdd')+substr(p_week,5,2)*7-
             to_char(trunc(to_date(substr(p_week,1,4)||'01'||'01','yyyymmdd'),'yyyy'),'d')+p_start_date-v_flag
      into v_start_day
      from dual;
      return v_start_day;
    end getweekday;