下周日在甲骨文

时间:2017-10-28 09:47:16

标签: oracle

我想获得提供日期的下一个星期日(在我的查询中绑定变量)。所以我写了如下。

HalFull

这适用于所有日期,除非当天是星期天。如果这一天是星期日本身,它不应该在下周日给出,而应该在同一天返回。

3 个答案:

答案 0 :(得分:2)

只需使用CASE语句进行比较。

SELECT CASE
         WHEN TRIM(TO_CHAR(dt, 'DAY')) = 'SUNDAY' THEN dt
         ELSE NEXT_DAY(dt, 'SUN')
       END sunday
FROM   (SELECT NVL(TO_DATE(:1, 'DD-MON-YYYY'), '31-DEC-9999') dt
        FROM   dual);  

答案 1 :(得分:1)

从您的约会中减去1天,然后使用NEXT_DAY

SELECT NEXT_DAY(
         NVL(
           TO_DATE( :1, 'DD-MON-YYYY' ) - INTERVAL '1' DAY,
           DATE '9999-12-31'            -- Use a date literal
         ),
         'SUN'
       )
FROM   DUAL

答案 2 :(得分:0)

在讨论答案之前,我想解决你的方法的两个依赖关系。

首先 - 您依赖于默认的DATE格式

 NVL(TO_DATE(:1,'DD-MON-YYYY'),'31-DEC-9999')

NVL的第一个参数是date,第二个是要转换为DATE的String

第二次使用' SUN'在查询中取决于NLS设置。如果客户端具有不同的NLS_LANGUAGE设置,则查询将失败。试试

ALTER SESSION SET NLS_LANGUAGE= 'GERMAN';

此公式以NLS独立方式返回下周日:

 my_date + 6 - (trunc(my_date) - trunc(my_date,'IW')) 

解释

trunc(my_date) - trunc(my_date,'IW') 

返回0到6之间的数字。周一为零,周日为6。

 6 - (trunc(my_date) - trunc(my_date,'IW'))  

返回6到0之间的数字。星期一为6,星期日为零。这意味着这是直到下个星期天的天数。简单地将它添加到您的日期参数它将返回下一个星期日。 (对于星期日,你加零,即按预期你得到同一天。)

<强>测试

with my_dates as (
select  TO_DATE('28-10-2017','DD-MM-YYYY') + rownum -1 my_date  from DUAL connect by level <= 10 )

select my_date, trunc(my_date) - trunc(my_date,'IW')  day_of_week,
    6 - (trunc(my_date) - trunc(my_date,'IW')) days_to_next_sunday,
    -- next sunday formula
    my_date + 6 - (trunc(my_date) - trunc(my_date,'IW'))   next_sunday       
from my_dates;


MY_DATE   DAY_OF_WEEK DAYS_TO_NEXT_SUNDAY NEXT_SUNDAY
--------- ----------- ------------------- -----------
28-OCT-17           5                   1 29-OCT-17   
29-OCT-17           6                   0 29-OCT-17   
30-OCT-17           0                   6 05-NOV-17   
31-OCT-17           1                   5 05-NOV-17   
01-NOV-17           2                   4 05-NOV-17   
02-NOV-17           3                   3 05-NOV-17   
03-NOV-17           4                   2 05-NOV-17   
04-NOV-17           5                   1 05-NOV-17   
05-NOV-17           6                   0 05-NOV-17   
06-NOV-17           0                   6 12-NOV-17 

所以你的查询如下

SELECT  
   my_date + 6 - (trunc(my_date) - trunc(my_date,'IW'))   next_sunday 
FROM   (SELECT TO_DATE(NVL(:1, '31-DEC-9999'), 'DD-MON-YYYY') my_date
        FROM   dual);

要使用WHERE子句中的表达式,只需使用包含参数日期的一行子查询,并将其交叉连接到表中:

with my_date as (SELECT TO_DATE(NVL(:1, '31-DEC-9999'), 'DD-MON-YYYY') my_date FROM   dual)
select * from my_tab d cross join my_date 
where D.CAL_DATE <= my_date + 6 - (trunc(my_date) - trunc(my_date,'IW'));