zoukankan      html  css  js  c++  java
  • 表值函数--自定义工作日历


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

  • 相关阅读:
    [转载]oracle中的exists 和not exists 用法详解
    oracle中sql语句的优化(转帖)
    BizTalk Server 2010 使用 WCF Service [ 上篇 ]
    冒泡排序
    一起复习几何(4)
    手把手教你升级到 Mysql 5.5
    BizTalk Server 2010 映射器(Mapper) [ 上篇 ]
    基于OpenGL的渲染引擎
    BizTalk Server 2010 映射器(Mapper) [ 下篇 ]
    BizTalk Server 2010 映射器(Mapper) [ 中篇 ]
  • 原文地址:https://www.cnblogs.com/hzf08/p/6283384.html
Copyright © 2011-2022 走看看