您的位置:首页 > 数据库

SQL 计算两日期之间的工作天数和过滤工作日(周六、周日)

2013-02-22 14:02 489 查看
SQL 计算两日期之间的工作天数和过滤工作日(周六、周日)

--计算两个日期相差的工作天数

CREATE FUNCTION [dbo].[f_WorkDay](

@dt_begin datetime, --计算的开始日期

@dt_end datetime --计算的结束日期

)RETURNS int

AS

BEGIN

DECLARE @workday int,@i int,@bz bit,@dt datetime

IF @dt_begin>@dt_end

SELECT @bz=1,@dt=@dt_begin,@dt_begin=@dt_end,@dt_end=@dt

ELSE

SET @bz=0

SELECT @i=DATEDIFF(Day,@dt_begin,@dt_end)+1,

@workday=@i/7*5,

@dt_begin=DATEADD(Day,@i/7*7,@dt_begin)

WHILE @dt_begin<=@dt_end

BEGIN

SELECT @workday=CASE

WHEN (@@DATEFIRST+DATEPART(Weekday,@dt_begin)-1)%7 BETWEEN 1 AND 5

THEN @workday+1 ELSE @workday END,

@dt_begin=@dt_begin+1

END

RETURN(CASE WHEN @bz=1 THEN -@workday ELSE @workday END)

END

GO

USE [ezdsj_system]

GO

/****** Object: UserDefinedFunction [dbo].[f_WorkDayADD] Script Date: 02/22/2013 14:02:50 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

--在指定日期上,增加指定工作天数后的日期

CREATE FUNCTION [dbo].[f_WorkDayADD](

@date datetime, --基础日期

@workday int --要增加的工作日数

)RETURNS datetime

AS

BEGIN

DECLARE @bz int

--增加整周的天数

SELECT @bz=CASE WHEN @workday<0 THEN -1 ELSE 1 END

,@date=DATEADD(Week,@workday/5,@date)

,@workday=@workday%5

--增加不是整周的工作天数

WHILE @workday<>0

SELECT @date=DATEADD(Day,@bz,@date),

@workday=CASE WHEN (@@DATEFIRST+DATEPART(Weekday,@date)-1)%7 BETWEEN 1 AND 5

THEN @workday-@bz ELSE @workday END

--避免处理后的日期停留在非工作日上

WHILE (@@DATEFIRST+DATEPART(Weekday,@date)-1)%7 in(0,6)

SET @date=DATEADD(Day,@bz,@date)

RETURN(@date)

END

GO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: