Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Đếm ngày giữa hai phân đoạn

Đâ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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01861:chữ không khớp với chuỗi định dạng

  2. Câu hỏi phỏng vấn Oracle

  3. Java ResultSet.getString () cho trường Ngày hiển thị 00:00:00.0

  4. 12c VARCHAR2 (32767)

  5. Oracle Nhìn về phía sau Tích cực