这种方法很适合我在过去的类似需求
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