表值函数--自定义工作日历

本文介绍了一个SQL函数fn_WorkingCalendar,用于生成指定月份的工作日历。该函数可以根据是否为大小周、指定工作日和假日来自定义输出。通过调整参数,可以灵活地设置每月的工作日与休息日。


-- =============================================
-- 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

转载于:https://www.cnblogs.com/hzf08/p/6283384.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值