从周数获得第一周的第一天

时间:2012-12-04 15:43:25

标签: oracle plsql

在Oracle中,有一种直接的方法可以获得一周的第一天吗?

例如,今天的日期是12/4/2012。如果我跑: 从双重中选择to_char(sysdate,'WW'); 它返回49作为周数。

我想做的是第一天以某种方式返回2012年12月2日...给予第49周(假设星期日为一周的第一天)。

有什么想法吗?在此先感谢您的帮助!

6 个答案:

答案 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')
  • 获取您所在日期的星期数
  • 从您的日期加1来减去该数字,您将获得该周的星期日。
  • 添加7,您将获得一周结束的日期(星期六)。

像这样:

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;