表值函数--自定义工作日历
Posted hzf08
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表值函数--自定义工作日历相关的知识,希望对你有一定的参考价值。
-- =============================================
-- Author: hzf
-- Create date: 2016年8月16日11:25:55
-- Description: 取工作日历 默认大小周 法定假日和 调休 可以自定义
-- =============================================
-- select * from dbo.fn_WorkingCalendar(‘2016-06‘,1,‘2016-06-14,2016-06-06,‘,‘2016-06-01,2016-06-02,‘)
create FUNCTION [dbo].[fn_WorkingCalendar]
(
@Month varchar(7), --1.月份
@isDax bit =0, --2.是否大小周 0 否 1 是
@WKday varchar(100), --3.指定工作日 ‘2016-08-01,2016-08-16,2016-08-05‘
@Holiday varchar(100) --4.指定假日 ‘2016-08-01,2016-08-16,2016-08-05‘
)
RETURNS
@WK_CD TABLE(
Flag bit, --0 放假 1 上班
WDate varchar(10), --日期
ORDR int, --项次
WeekD varchar(14), --星期几
WKNO int --周别
)
AS
BEGIN
declare @SDAT datetime
-- 某月的第一天
set @SDAT = cast( @Month + ‘-01‘ as datetime)
declare @Cnt_Month int
-- 查询某月的天数
set @Cnt_Month = day(dateadd(month,1, @SDAT)-1)
declare @TDATE varchar(10)
declare @Cnt int
set @Cnt = 0
--1.双休
while @Cnt < @Cnt_Month
begin
insert into @WK_CD(Flag, WDate, ORDR, WeekD, WKNO) values(1, convert(varchar(10),dateadd(day, @Cnt, @SDAT), 120),@Cnt+1,datename(WEEKDAY,dateadd(day, @Cnt, @SDAT)),datepart(week,dateadd(day, @Cnt, @SDAT)) )
update @WK_CD set Flag = case when right(WeekD,1) in(‘一‘,‘二‘,‘三‘,‘四‘,‘五‘) then 1 else 0 end
set @Cnt = @Cnt +1
end
-- 大小周
if @isDax = 1
begin
update @WK_CD set Flag = 1 where right(WeekD,1) = ‘六‘ and WKNO % 2 = 1
end
declare @PointerPrev int --开始位置
declare @PointerCurr int --第一次出现位置
--2.有加班
set @PointerPrev = 1
while @PointerPrev < LEN(@WKday)
begin
set @PointerCurr = CHARINDEX(‘,‘, @WKday, @PointerPrev)
if @PointerCurr > 0
begin
set @TDATE = substring(@WKday, @PointerPrev, @PointerCurr - @PointerPrev)
update @WK_CD set Flag = 1 where WDate = @TDATE
set @PointerPrev = @PointerCurr + 1
end
else
break
end
--3.有调休
set @PointerPrev = 1
while @PointerPrev < LEN(@Holiday)
begin
set @PointerCurr = CHARINDEX(‘,‘, @Holiday, @PointerPrev)
if @PointerCurr > 0
begin
set @TDATE = substring(@Holiday, @PointerPrev, @PointerCurr - @PointerPrev)
update @WK_CD set Flag = 0 where WDate = @TDATE
set @PointerPrev = @PointerCurr + 1
end
else
break
end
RETURN
END
以上是关于表值函数--自定义工作日历的主要内容,如果未能解决你的问题,请参考以下文章