34,590
社区成员
发帖
与我相关
我的任务
分享
create table 数据表(RequestDate date, CompletionDate varchar(12))
create table 节假日(Holiday date, description varchar(12))
create table 调休日(Workingdays date, description varchar(20))
insert into 数据表
select '2013-04-26', '2013-05-06' union all
select '2013-04-12', '2013-04-15'
insert into 节假日
select '2013-04-04', '清明节' union all
select '2013-04-05', '清明节' union all
select '2013-04-06', '清明节' union all
select '2013-04-29', '劳动节' union all
select '2013-04-30', '劳动节' union all
select '2013-05-01', '劳动节' union all
select '2013-06-10', '端午节' union all
select '2013-06-11', '端午节' union all
select '2013-06-12', '端午节'
insert into 调休日
select '2013-01-05', '元旦调休' union all
select '2013-01-06', '元旦调休' union all
select '2013-02-16', '春节调休' union all
select '2013-02-17', '春节调休' union all
select '2013-04-07', '清明节调休' union all
select '2013-04-27', '劳动节调休' union all
select '2013-04-28', '劳动节调休' union all
select '2013-06-08', '端午节调休' union all
select '2013-06-09', '端午节调休' union all
select '2013-09-22', '中秋节调休' union all
select '2013-09-29', '国庆节调休' union all
select '2013-10-12', '国庆节调休'
select RequestDate,
CompletionDate,
'天数'=datediff(d,RequestDate,CompletionDate)-
(select count(1) from 节假日 where Holiday between RequestDate and CompletionDate)-
(select count(1) from
(select cast(dateadd(d,number,'2013-01-01') as date) 'ssd'
from master.dbo.spt_values
where type='P' and datepart(dw,dateadd(d,number,'2013-01-01')) in(1,7)) t
where t.ssd between RequestDate and CompletionDate
and t.ssd not in(select Holiday from 节假日))+
(select count(1) from 调休日 where Workingdays between RequestDate and CompletionDate)
from 数据表
/*
RequestDate CompletionDate 天数
----------- -------------- -----------
2013-04-26 2013-05-06 5
2013-04-12 2013-04-15 1
(2 row(s) affected)
*/
CREATE TABLE t1 --数据表
(
RequestDate DATE,
CompletionDate DATE
)
INSERT INTO t1
SELECT '2013-04-26','2013-05-06' UNION ALL
SELECT '2013-04-12','2013-04-15'
CREATE TABLE t2 --节假日
(
Holiday DATE,
Descrip VARCHAR(10)
)
INSERT INTO t2
SELECT '2013-04-04','清明节' UNION ALL
SELECT '2013-04-05','清明节' UNION ALL
SELECT '2013-04-06','清明节' UNION ALL
SELECT '2013-04-29','劳动节' UNION ALL
SELECT '2013-04-30','劳动节' UNION ALL
SELECT '2013-05-01','劳动节' UNION ALL
SELECT '2013-06-10','端午节' UNION ALL
SELECT '2013-06-11','端午节' UNION ALL
SELECT '2013-06-12','端午节'
CREATE TABLE t3 --调休日
(
Workingdays DATE,
Descrip VARCHAR(20)
)
INSERT INTO t3
SELECT '2013-01-05','元旦调休' UNION ALL
SELECT '2013-01-06','元旦调休' UNION ALL
SELECT '2013-02-16','春节调休' UNION ALL
SELECT '2013-02-17','春节调休' UNION ALL
SELECT '2013-04-07','清明节调休' UNION ALL
SELECT '2013-04-27','劳动节调休' UNION ALL
SELECT '2013-04-28','劳动节调休' UNION ALL
SELECT '2013-06-08','端午节调休' UNION ALL
SELECT '2013-06-09','端午节调休' UNION ALL
SELECT '2013-09-22','中秋节调休' UNION ALL
SELECT '2013-09-29','国庆节调休' UNION ALL
SELECT '2013-10-12','国庆节调休'
SELECT * FROM t1
SELECT * FROM t2
SELECT * FROM t3
SET DATEFIRST 1
;WITH AAA AS
(
SELECT RequestDate,
CompletionDate,
DATEADD(DAY,number,RequestDate) AS riqi
FROM T1 AS A WITH(NOLOCK) INNER JOIN
master..spt_values AS B WITH(NOLOCK) ON DATEADD(DAY,number,RequestDate)<=CompletionDate
AND B.[type]='P'
AND NOT EXISTS (
SELECT 1
FROM T2 AS A1 WITH(NOLOCK)
WHERE DATEADD(DAY,number,RequestDate)=A1.Holiday
)
AND DATEPART(WEEKDAY,DATEADD(DAY,number,RequestDate)) IN (6,7)
)
,BBB AS
(
SELECT *
FROM AAA
UNION ALL
SELECT A.RequestDate,
A.CompletionDate,
B.Workingdays AS riqi
FROM T1 AS A WITH(NOLOCK) INNER JOIN
T3 AS B WITH(NOLOCK) ON B.Workingdays BETWEEN A.RequestDate AND A.CompletionDate
)
SELECT RequestDate,
CompletionDate,
COUNT(riqi)-1 AS [天数]
FROM BBB
GROUP BY RequestDate,CompletionDate
RequestDate CompletionDate 天数
2013-04-12 2013-04-15 1
2013-04-26 2013-05-06 5
select requestdate,completiondate,天数=
DATEDIFF(day,requestdate,completiondate)-(select count(1) from holidays
where holiday between requestdate and completiondate)+(
select count(1) from tiaoxiu
where [working days] between requestdate and completiondate
)