SQL在不使用连接查找表的情况下创建周中的周结束日期

时间:2018-01-25 10:17:44

标签: sql oracle date-arithmetic

我想知道是否可以构建一个ORACLE SQL FUNCTION来返回一个周中的日期,而不是使用连接表。

本周结束于星期三,所以如果我们的日期是1月5日星期五那么结束日期将是以后的星期三10/01/2018

MON 1ST JAN - 03/01/18
TUES 2ND JAN - 03/01/18
WED 3RD JAN - 03/01/18
THURS 4TH JAN - 10/01/18
FRI 5TH JAN - 10/01/18
SAT 6TH JAN - 10/01/18
SUN 7TH JAN - 10/01/18
MON 8TH JAN - 10/01/18
TUES 9TH JAN - 10/01/18
WED 10TH JAN - 10/01/18
THURS 11TH JAN - 17/01/18

我正在调查功能路线的原因是为了将来证明这个过程,所以我没有维护第二个查找表&摆脱不必要的联接。

2 个答案:

答案 0 :(得分:2)

我成功了解了一项工作

SELECT NEXT_DAY('25-JAN-2018 00.00', 'WEDNESDAY')FROM DUAL;

答案 1 :(得分:1)

您可能需要以下内容:

select d, 
       case
            when trunc(d, 'IW') +2 >= d
                then trunc(d, 'IW') +2
                else trunc(d, 'IW') +9
       end as next_wed
from (
        select date '2018-01-01' + level -1 as d
        from dual
        connect by level <= 11
     )

这会得到包含日期的星期一的星期一,然后加上2或9,具体取决于在输入日期前一天加2的事实。

另一种方法可以是检查输入日期是否在本周的周三之前或之后:

case when to_char(d, 'D') <= 3
     then trunc(d, 'IW') +2
     else trunc(d, 'IW') +9
end as next_wed