用SQL语言计算两个日期间有多少个工作日
1个回答
展开全部
/*
因为工作中一个奇怪的需求,要用SQL语言计算两个日期间有多少个工作日。
设定是一个星期有5个工作日,从星期一到星期五
说明:
第一个星期的工作日数:DATEPART(dw,
@begdt)-DATEPART(dw,
@begdt),最少0天
末一个星期的工作日数:DATEPART(dw,
@enddt),最多5天
计算方法:
如果两个日期处在同一个星期内,直接计算“第一个星期的工作日数”
否则按下面的公式计算
(两个日期间的总天数
-
第一个星期的天数
-
末一个星期的天数)
/
7
*
5
+
第一个星期的工作日数
+
末一个星期的工作日数
*/
--计算并返回两个日期间的工作小时数(工作日*8)按周一到周五计算
--必须先SET
DATEFIRST
1
CREATE
FUNCTION
dbo.CalcWorkHours(@bdate
DATETIME,
@edate
DATETIME)
RETURNS
INTEGER
AS
BEGIN
DECLARE
@hours
INTEGER
IF
@@DATEFIRST
<>
1
OR
@bdate
>
@edate
RETURN
-1
SELECT
@hours
=
--如果终止日期与起始日期在同一个星期内,只需要计算有几天即可
CASE
WHEN
DATEPART(wk,
@edate-1)-DATEPART(wk,@bdate)
=
0
THEN
CASE
WHEN
DATEPART(dw,
@bdate)
>
5
THEN
0
WHEN
DATEPART(dw,
@edate-1)
>
5
THEN
6
-
DATEPART(dw,
@bdate)
ELSE
DATEPART(dw,
@edate-1)
-
DATEPART(dw,
@bdate)
+
1
END
--如果终止日期与起始日期在不同的星期内
--首先计算出除前后两个星期外完整的星期数
*
5
ELSE
(DATEDIFF(dd,@bdate,@edate)
-
(8-DATEPART(dw,
@bdate))
-
DATEPART(dw,
@edate-1))
/
7
*
5
--再加上第一个星期里的工作日数
+
CASE
WHEN
DATEPART(dw,
@bdate)
<
6
THEN
6
-
DATEPART(dw,
@bdate)
ELSE
0
END
--加上末一个星期里的工作日数
+
CASE
WHEN
DATEPART(dw,
@edate-1)>5
THEN
5
ELSE
DATEPART(dw,
@edate-1)
END
END
RETURN
@hours
END
因为工作中一个奇怪的需求,要用SQL语言计算两个日期间有多少个工作日。
设定是一个星期有5个工作日,从星期一到星期五
说明:
第一个星期的工作日数:DATEPART(dw,
@begdt)-DATEPART(dw,
@begdt),最少0天
末一个星期的工作日数:DATEPART(dw,
@enddt),最多5天
计算方法:
如果两个日期处在同一个星期内,直接计算“第一个星期的工作日数”
否则按下面的公式计算
(两个日期间的总天数
-
第一个星期的天数
-
末一个星期的天数)
/
7
*
5
+
第一个星期的工作日数
+
末一个星期的工作日数
*/
--计算并返回两个日期间的工作小时数(工作日*8)按周一到周五计算
--必须先SET
DATEFIRST
1
CREATE
FUNCTION
dbo.CalcWorkHours(@bdate
DATETIME,
@edate
DATETIME)
RETURNS
INTEGER
AS
BEGIN
DECLARE
@hours
INTEGER
IF
@@DATEFIRST
<>
1
OR
@bdate
>
@edate
RETURN
-1
SELECT
@hours
=
--如果终止日期与起始日期在同一个星期内,只需要计算有几天即可
CASE
WHEN
DATEPART(wk,
@edate-1)-DATEPART(wk,@bdate)
=
0
THEN
CASE
WHEN
DATEPART(dw,
@bdate)
>
5
THEN
0
WHEN
DATEPART(dw,
@edate-1)
>
5
THEN
6
-
DATEPART(dw,
@bdate)
ELSE
DATEPART(dw,
@edate-1)
-
DATEPART(dw,
@bdate)
+
1
END
--如果终止日期与起始日期在不同的星期内
--首先计算出除前后两个星期外完整的星期数
*
5
ELSE
(DATEDIFF(dd,@bdate,@edate)
-
(8-DATEPART(dw,
@bdate))
-
DATEPART(dw,
@edate-1))
/
7
*
5
--再加上第一个星期里的工作日数
+
CASE
WHEN
DATEPART(dw,
@bdate)
<
6
THEN
6
-
DATEPART(dw,
@bdate)
ELSE
0
END
--加上末一个星期里的工作日数
+
CASE
WHEN
DATEPART(dw,
@edate-1)>5
THEN
5
ELSE
DATEPART(dw,
@edate-1)
END
END
RETURN
@hours
END
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询