2017-10-28 104 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 
相關問題