2017-10-28 46 views
0

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

SELECT NEXT_DAY(NVL(TO_DATE(:1,'DD-MON-YYYY'),'31-DEC-9999'),'SUN') FROM DUAL 

这是工作的所有日期,除非如果一天是星期日本身。如果一天是星期天,它不应该在下个星期天,而应该在同一天返回。

回答

0

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

首先 - 你依赖于默认的日期格式

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

的NVL的第一个参数是日期,第二个是字符串使用转换为DATE

“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 - (trunc(my_date) - trunc(my_date,'IW')) 

返回一个介于6和0之间的数字。星期一至星期六为六。这意味着这是直到下个星期天的天数。简单地将它添加到日期参数中,它将返回下一个星期日。 (星期天你加零,也就是如你所预料的那样你得到同一天)。

测试

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')); 
+0

我在WHERE条件使用。部分代码: 其中TO_DATE(D.CAL_DATE)<= NEXT_DAY(NVL(TO_DATE(:1,'DD-MON-YYYY'),'31-DEC-9999'),'SUN') 所以我会必须以这种方式写东西..你能帮忙吗? –

+0

我在WHERE子句HTH中添加了用法。 –

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天,然后用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 
相关问题