計算を行う 1 つの方法を次に示します。カレンダー テーブルを使用しません。唯一の入力データは、WITH 句に含めた最初のテーブル (ID と HIRE_DATE) からのものです (質問に答えるクエリの一部ではありません!)。それ以外はすべて計算されます。雇用日を含む日数を計算する方法を示します。それが必要ない場合は、最後に 1 を引きます。
TRUNC(
の月曜日です 。このクエリは、月曜日と EOM の間の EOM 週に何日あるかを計算しますが、5 日以内です (EOM が土曜日または日曜日の場合)。 HIRE_DATE についても同様の計算を行いますが、月曜日から HIRE_DATE までの日数を除外してカウントします。 HIRE_DATE。最後の部分では、HIRE_DATE の月曜日から EOM の月曜日までの 1 週間ごとに 5 日を追加しています。
with sample_data(id, Hire_date) as ( select 1, to_date('09/26/2018', 'mm/dd/yyyy') from dual union all select 2, to_date('07/10/ 2018', 'mm/dd/yyyy') from dual )select id, to_char(hire_date, 'Dy mm/dd/yyyy') をhire_date, to_char(eom, 'Dy mm/dd/yyyy') as eom, least (5, eom - eom_mon + 1) - least(5, 雇用日 - 雇用月) + (eom_mon - 雇用月) * 5 / 7 as workdaysfrom ( select id, 雇用日, last_day(hire_date) as eom, trunc(hire_date, 'iw' ) 雇う_mon として, trunc(last_day(hire_date), 'iw') として eom_mon from sample_data ); ID HIRE_DATE EOM WORKDAYS---------- ----------------------- ------------- ---------- ---------- 1 水 2018 年 9 月 26 日 日 2018 年 9 月 30 日 3 2 火 2018 年 7 月 10 日 火 2018 年 7 月 31 日 16コード> プレ>