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



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

  • 相关阅读:
    AngularJS笔记---数据绑定
    Javascript笔记--函数
    C#笔记---动态类(Dynamic)应用
    Javascript笔记--Objects
    Javascript笔记----实现Page页面右下角置顶按钮.
    C#基础---扩展方法的应用
    .Net程序员之Python基础教程学习----函数和异常处理[Fifth Day]
    1.3 函数式接口
    1.2 lambda 表达式的语法
    1.1 为什么要使用lambda 表达式
  • 原文地址:https://www.cnblogs.com/hzf08/p/6283384.html
Copyright © 2020-2023  润新知