create table MyTable
(
start_date date not null,
end_date date not null,
code int not null
)
GO
create table HolidayDates
(
holydayDate date not null,
holydayDescription varchar(100) not null
)
GO
insert into MyTable
values
('2018-12-25','2019-01-01',101)
,('2018-12-01','2019-01-31',102)
,('2018-12-24','2019-01-02',103)
GO
insert into HolidayDates
values
('2018-12-25', 'xmas')
,('2019-01-01', 'Reveillon')
GO
Trong truy vấn dưới đây, bạn có thể thấy cách các cột được tính toán.
[các ngày lễ (không phải cuối tuần)]: lấy mẫu tất cả các ngày thánh, bảng của bạn cũng không phải là ngày cuối tuần (vì vậy chúng không được tính hai lần).
cuối tuần: nhận các ngày cuối tuần trong kỳ.
Phần còn lại, các cột có thể tự giải thích
Tuyên bố từ chối trách nhiệm , bạn có thể đơn giản hóa điều này một chút, đó chỉ là một truy vấn ví dụ về cách sử dụng
select
datediff(day, mt.start_date, mt.end_date) as [total days],
(
select
count(*)
from
HolidayDates hd
where
hd.holydayDate between mt.start_date
and mt.end_date
and DATEPART(WEEKDAY, hd.holydayDate) between 2
and 6
) as [holydays (not weekends) ],
(
select
(
datediff(wk, mt.start_date, mt.end_date) * 2
) +(
case when datename(dw, mt.start_date) = 'sunday' then 1 else 0 end
) +(
case when datename(dw, mt.end_date) = 'saturday' then 1 else 0 end
)
) as weekends,
case when datediff(day, mt.start_date, mt.end_date) -(
select
(
datediff(wk, mt.start_date, mt.end_date) * 2
) +(
case when datename(dw, mt.start_date) = 'sunday' then 1 else 0 end
) +(
case when datename(dw, mt.end_date) = 'saturday' then 1 else 0 end
)
) -(
select
count(*)
from
HolidayDates hd
where
hd.holydayDate between mt.start_date
and mt.end_date
and DATEPART(WEEKDAY, hd.holydayDate) between 2
and 6
) > 3 then 0 --> this need to exclude weekend and holidays
when mt.code = 1 then 1 when mt.code = 2 then 2 else 3 end as mycolumn
from
MyTable mt
QUAY LẠI
total days holydays (not weekends) weekends mycolumn
----------- ----------------------- ----------- -----------
7 2 2 3
61 2 18 0
9 2 2 0
(3 row(s) affected)