2

在 Oracle 中,是否有一种简单的方法可以在给定周数的情况下获得一周的第一天?

例如,今天的日期是 2012 年 12 月 4 日。如果我运行: select to_char(sysdate,'WW') from dual; 它返回 49 作为周数。

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

有任何想法吗?提前感谢您的帮助!

4

6 回答 6

7

试试这个:

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
于 2012-12-04T16:10:34.493 回答
4

试试这个,

select 
  next_day(trunc(to_date(in_year,'yyyy'),'yyyy') -1,'Mon') + (7 * (in_week - 1)) 
from dual;
于 2014-07-09T09:17:21.877 回答
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
于 2013-03-12T19:08:32.247 回答
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'

因为我们跨越一年多,所以我们也需要检查年份。

于 2013-09-14T14:05:08.847 回答
0

使用 @Justin 使用的 trunc 函数,我认为这就是你想要的:

select trunc(to_date('2012-01-01', 'YYYY-MM-DD') + (49 - 1) * 7, 'WW') from dual;
于 2012-12-04T15:53:52.110 回答
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;
于 2016-09-08T08:25:51.523 回答