私は、指定された日付の次の日曜日(私のクエリでは変数をバインドする)を取得したいと思います。だから私は以下のように書きました。次の日曜日Oracleで
SELECT NEXT_DAY(NVL(TO_DATE(:1,'DD-MON-YYYY'),'31-DEC-9999'),'SUN') FROM DUAL
これは、日が日曜日の場合を除き、すべての日付で機能します。日が日曜日の場合は、それは次の日曜日に与えるべきではなく、同じ日に返すべきです。
私は、指定された日付の次の日曜日(私のクエリでは変数をバインドする)を取得したいと思います。だから私は以下のように書きました。次の日曜日Oracleで
SELECT NEXT_DAY(NVL(TO_DATE(:1,'DD-MON-YYYY'),'31-DEC-9999'),'SUN') FROM DUAL
これは、日が日曜日の場合を除き、すべての日付で機能します。日が日曜日の場合は、それは次の日曜日に与えるべきではなく、同じ日に返すべきです。
答えを議論する前に、あなたのアプローチの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'));
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日を減算して、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
。コードの一部: TO_DATE(D.CAL_DATE)<= NEXT_DAY(NVL(TO_DATE(:1、 'DD-MON-YYYY')、 '31-DEC-9999')、 'SUN') そのように物事を書かなければならない..助けてもらえますか? –
私はWHERE句、HTHでその使用法を追加しました。 –