這種方法很適合我在過去的類似需求
select
t.START_DATE
, t.END_DATE
, trunc(to_number(t.END_DATE - t.START_DATE)) + 1
- trunc(to_number(t.END_DATE - t.START_DATE)/7) * 2
- (CASE WHEN to_char(t.START_DATE,'day') = 'sunday' THEN 1 ELSE 0 END)
- (CASE WHEN to_char(t.END_DATE,'day') = 'saturday' THEN 1 ELSE 0 END)
weekdays
, trunc(to_number(t.END_DATE - t.START_DATE)) + 1
- trunc(to_number(t.END_DATE - t.START_DATE)/7) * 2
- (select count(*) from holiday_table
where holidays between t.START_DATE and t.END_DATE)
businessdays_A
, trunc(to_number(t.END_DATE - t.START_DATE)) + 1
- trunc(to_number(t.END_DATE - t.START_DATE)/7) * 2
- (CASE WHEN to_char(t.START_DATE,'day') = 'sunday' THEN 1 ELSE 0 END)
- (CASE WHEN to_char(t.END_DATE,'day') = 'saturday' THEN 1 ELSE 0 END)
- (select count(*) from holiday_table
where holidays between t.START_DATE and t.END_DATE)
businessdays_B
from main_table T
編輯我現在已經看到了一些樣本數據我不知道,如果你需要刪除週末或沒有。看來你可能非工作日明確存儲曾經在假期表,所以你可能只需要這樣:
, trunc(to_number(t.END_DATE - t.START_DATE)) + 1
- (select count(*) from holiday_table
where holidays between t.START_DATE and t.END_DATE)
businessdays_C
SQL Fiddle
CREATE TABLE MAIN_TABLE
(START_DATE DATE, END_DATE DATE)
;
INSERT ALL
INTO main_table (START_DATE, END_DATE)
VALUES (TO_DATE('01-Oct-2017','dd-mon-yyyy'), TO_DATE('10-Oct-2017','dd-mon-yyyy'))
INTO main_table (START_DATE, END_DATE)
VALUES (TO_DATE('05-Oct-2017','dd-mon-yyyy'), TO_DATE('20-Oct-2017','dd-mon-yyyy'))
INTO main_table (START_DATE, END_DATE)
VALUES (TO_DATE('29-Sep-2017','dd-mon-yyyy'), TO_DATE('05-Oct-2017','dd-mon-yyyy'))
SELECT * FROM dual
;
CREATE TABLE HOLIDAY_TABLE
(HOLIDAYS DATE, NAME varchar2(14))
;
INSERT ALL
INTO holiday_table (HOLIDAYS, NAME)
VALUES (TO_DATE('01-Oct-2017','dd-mon-yyyy'), 'Sunday')
INTO holiday_table (HOLIDAYS, NAME)
VALUES (TO_DATE('02-Oct-2017','dd-mon-yyyy'), 'Gandhi Jayanti')
INTO holiday_table (HOLIDAYS, NAME)
VALUES (TO_DATE('07-Oct-2017','dd-mon-yyyy'), 'Saturday')
INTO holiday_table (HOLIDAYS, NAME)
VALUES (TO_DATE('08-Oct-2017','dd-mon-yyyy'), 'Sunday')
INTO holiday_table (HOLIDAYS, NAME)
VALUES (TO_DATE('14-Oct-2017','dd-mon-yyyy'), 'Saturday')
INTO holiday_table (HOLIDAYS, NAME)
VALUES (TO_DATE('15-Oct-2017','dd-mon-yyyy'), 'Sunday')
INTO holiday_table (HOLIDAYS, NAME)
VALUES (TO_DATE('19-Oct-2017','dd-mon-yyyy'), 'Diwali')
SELECT * FROM dual
;
查詢1:
select
t.START_DATE
, t.END_DATE
, trunc(to_number(t.END_DATE - t.START_DATE)) + 1
- trunc(to_number(t.END_DATE - t.START_DATE)/7) * 2
- (CASE WHEN to_char(t.START_DATE,'day') = 'sunday' THEN 1 ELSE 0 END)
- (CASE WHEN to_char(t.END_DATE,'day') = 'saturday' THEN 1 ELSE 0 END)
weekdays
, trunc(to_number(t.END_DATE - t.START_DATE)) + 1
- trunc(to_number(t.END_DATE - t.START_DATE)/7) * 2
- (select count(*) from holiday_table
where holidays between t.START_DATE and t.END_DATE)
businessdays_A
, trunc(to_number(t.END_DATE - t.START_DATE)) + 1
- trunc(to_number(t.END_DATE - t.START_DATE)/7) * 2
- (CASE WHEN to_char(t.START_DATE,'day') = 'sunday' THEN 1 ELSE 0 END)
- (CASE WHEN to_char(t.END_DATE,'day') = 'saturday' THEN 1 ELSE 0 END)
- (select count(*) from holiday_table
where holidays between t.START_DATE and t.END_DATE)
businessdays_B
, trunc(to_number(t.END_DATE - t.START_DATE)) + 1
- (select count(*) from holiday_table
where holidays between t.START_DATE and t.END_DATE)
businessdays_C
from main_table T
Results:
| START_DATE | END_DATE | WEEKDAYS | BUSINESSDAYS_A | BUSINESSDAYS_B | BUSINESSDAYS_C |
|----------------------|----------------------|----------|----------------|----------------|----------------|
| 2017-10-01T00:00:00Z | 2017-10-10T00:00:00Z | 8 | 4 | 4 | 6 |
| 2017-10-05T00:00:00Z | 2017-10-20T00:00:00Z | 12 | 7 | 7 | 11 |
| 2017-09-29T00:00:00Z | 2017-10-05T00:00:00Z | 7 | 5 | 5 | 5 |
請提供樣本數據和預期結果(根據您提供的數據) –
您的數據模型不清楚。假期屬性的內容是什麼?輸出結果也不清楚。 –
我已經抽出了I/P和期望的O/P表以及所提到的表的屬性。讓我知道,如果它仍然不清楚。 – Sam