Đây là một cách để thực hiện phép tính - KHÔNG sử dụng bảng lịch. Dữ liệu đầu vào duy nhất là những gì đến từ bảng đầu tiên của bạn (ID và HIRE_DATE), mà tôi đã đưa vào mệnh đề WITH (không phải là một phần của truy vấn trả lời câu hỏi của bạn!). Mọi thứ khác đều được tính toán. Tôi chỉ cách tính số ngày BAO GỒM ngày thuê; nếu bạn không cần điều đó, hãy trừ đi 1 ở cuối.
TRUNC(<date>, 'iw')
là Thứ Hai trong tuần của <date>
. Truy vấn tính toán có bao nhiêu ngày trong tuần EOM, từ Thứ Hai đến EOM, nhưng không quá 5 (trong trường hợp EOM có thể là Thứ Bảy hoặc Chủ Nhật). Nó thực hiện một phép tính tương tự cho HIRE_DATE, nhưng nó tính các ngày từ Thứ Hai đến HIRE_DATE không bao gồm NGÀY THUÊ. Phần cuối cùng là thêm 5 ngày cho mỗi tuần đầy đủ từ Thứ Hai của HIRE_DATE đến Thứ Hai của EOM.
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') as hire_date,
to_char(eom, 'Dy mm/dd/yyyy') as eom,
least(5, eom - eom_mon + 1) - least(5, hire_date - hire_mon)
+ (eom_mon - hire_mon) * 5 / 7 as workdays
from (
select id, hire_date, last_day(hire_date) as eom,
trunc(hire_date, 'iw') as hire_mon,
trunc(last_day(hire_date), 'iw') as eom_mon
from sample_data
)
;
ID HIRE_DATE EOM WORKDAYS
---------- ----------------------- ----------------------- ----------
1 Wed 09/26/2018 Sun 09/30/2018 3
2 Tue 07/10/2018 Tue 07/31/2018 16