2017-10-28 15 views
0

私は、指定された日付の次の日曜日(私のクエリでは変数をバインドする)を取得したいと思います。だから私は以下のように書きました。次の日曜日Oracleで

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

これは、日が日曜日の場合を除き、すべての日付で機能します。日が日曜日の場合は、それは次の日曜日に与えるべきではなく、同じ日に返すべきです。

答えて

0

答えを議論する前に、あなたのアプローチの2つの依存関係を取り上げたいと思います。

最初に - あなたはNVLの最初のパラメータは日付で、第二は、「SUNを使用して日付に変換される文字列

セカンドあるデフォルトの日付書式

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

に依存'は、NLS設定に依存します。クライアントが異なるNLS_LANGUAGE設定を持つ場合、クエリは失敗します。まで月曜日0と6ゼロの数値を返します

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

説明

trunc(my_date) - trunc(my_date,'IW') 
:この式は、NLSの独立方法で、次の日曜日 を返す

ALTER SESSION SET NLS_LANGUAGE= 'GERMAN'; 

で試してみてください日曜日は6です。

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

は、6と0の間の数値を返します。日曜日は月曜日が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句簡単な使用であなたのパラメーター日付とクロスを含む1行でサブクエリのファクタリングを表現を使用するには、次のようにだからあなたのクエリは次のようになりテーブルに登録してください:

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

。コードの一部: 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 
関連する問題