工作日计算(含节假日)

--创建节假日表

IF NOT EXISTS (SELECT NAME FROM SYSOBJECTS WHERE NAME = 'Holiday' AND OBJECTPROPERTY(ID, 'ISTABLE') = 1)

BEGIN
  CREATE TABLE Holiday(
    IID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    HD_Date DATETIME,          --日期
    HD_CHNDate VARCHAR(20),    --农历
    HD_WeekName VARCHAR(10),   --星期
    HD_State VARCHAR(10),      --状态
    HD_Memo VARCHAR(500)       --备注
  )
END
GO


--2013年节假日表
INSERT INTO Holiday(HD_Date, HD_WeekName, HD_State, HD_Memo)
SELECT '2013-01-01', '星期二', '休息日', '元旦放3天假'
UNION SELECT '2013-01-02', '星期三', '休息日', ''
UNION SELECT '2013-01-03', '星期四', '休息日', ''
UNION SELECT '2013-01-05', '星期六', '工作日', ''
UNION SELECT '2013-01-06', '星期日', '工作日', ''
UNION SELECT '2013-02-09', '星期六', '休息日', '春节7天假'
UNION SELECT '2013-02-10', '星期日', '休息日', ''
UNION SELECT '2013-02-11', '星期一', '休息日', ''
UNION SELECT '2013-02-12', '星期二', '休息日', ''
UNION SELECT '2013-02-13', '星期三', '休息日', ''
UNION SELECT '2013-02-14', '星期四', '休息日', ''
UNION SELECT '2013-02-15', '星期五', '休息日', ''
UNION SELECT '2013-02-16', '星期六', '工作日', ''
UNION SELECT '2013-02-17', '星期日', '工作日', ''
UNION SELECT '2013-04-04', '星期四', '休息日', '清明3天假'
UNION SELECT '2013-04-05', '星期五', '休息日', ''
UNION SELECT '2013-04-06', '星期六', '休息日', ''
UNION SELECT '2013-04-07', '星期日', '工作日', ''
UNION SELECT '2013-04-27', '星期六', '工作日', '五一劳动节假日调整'
UNION SELECT '2013-04-28', '星期日', '工作日', ''
UNION SELECT '2013-04-29', '星期一', '休息日', ''
UNION SELECT '2013-04-30', '星期二', '休息日', ''
UNION SELECT '2013-05-01', '星期三', '休息日', ''
UNION SELECT '2013-06-08', '星期六', '工作日', '端午节假日调整'
UNION SELECT '2013-06-09', '星期日', '工作日', ''
UNION SELECT '2013-06-10', '星期一', '休息日', ''
UNION SELECT '2013-06-11', '星期二', '休息日', ''
UNION SELECT '2013-06-12', '星期三', '休息日', ''
UNION SELECT '2013-09-19', '星期四', '休息日', '中秋节假日调整'
UNION SELECT '2013-09-20', '星期五', '休息日', ''
UNION SELECT '2013-09-21', '星期六', '休息日', ''
UNION SELECT '2013-09-22', '星期日', '工作日', ''
UNION SELECT '2013-09-29', '星期日', '工作日', '国庆节假日调整'
UNION SELECT '2013-10-01', '星期二', '休息日', ''
UNION SELECT '2013-10-02', '星期三', '休息日', ''
UNION SELECT '2013-10-03', '星期四', '休息日', ''
UNION SELECT '2013-10-04', '星期五', '休息日', ''
UNION SELECT '2013-10-05', '星期六', '休息日', ''
UNION SELECT '2013-10-06', '星期日', '休息日', ''
UNION SELECT '2013-10-07', '星期一', '休息日', ''
UNION SELECT '2013-10-12', '星期六', '工作日', ''
GO


--工作日处理函数
IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE NAME = 'fn_WorkDay' AND XTYPE IN (N'FN', N'IF', N'TF'))
   DROP FUNCTION fn_WorkDay
GO
 
--计算两个日期相差的工作天数
CREATE FUNCTION fn_WorkDay(
  @DBegin DATETIME,  --计算的开始日期
  @DEnd  DATETIME,   --计算的结束日期
  @CalcHD BIT = 1    --计算节假日
)RETURNS INT
AS
BEGIN
    DECLARE @WorkDay INT, --工作日数
            @Flag BIT,    --标志,标志开始日期与结束日期的大小所计算结果的正负数
            @TmpDate DATETIME,  --临时变量存储
            @HDNum INT,   --节假日中的工作日数,正数表示工作日数,负数标识休息日数
            @i INT
            
    SET @HDNum = 0
    
    --交换日期,比较开始日期与结束日期,并正确的设置大小顺序
    IF @DBegin>@DEnd
        SELECT @Flag=1, @TmpDate = @DBegin, @DBegin = @DEnd, @DEnd = @TmpDate
    ELSE
        SELECT @Flag=0
    --将开始日期存储在临时变量中,后续计算需要
    SET @TmpDate = @DBegin
        
    --计算标准休息日    
    SELECT @i = DATEDIFF(Day, @DBegin, @DEnd) + 1,
           @WorkDay = @i / 7 * 5,
           @DBegin = DATEADD(Day, @i / 7 * 7, @DBegin)
    WHILE @DBegin <= @DEnd
    BEGIN
        SELECT @WorkDay = CASE 
            WHEN (@@DATEFIRST + DATEPART(Weekday, @DBegin) - 1) % 7 BETWEEN 1 AND 5
            THEN @WorkDay + 1 ELSE @WorkDay END,
            @DBegin = @DBegin + 1
    END

    --计算节假日中的假日数
    IF @CalcHD = 1 
    BEGIN
      IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE NAME = 'Holiday' AND OBJECTPROPERTY(ID, 'ISTABLE') = 1)
      BEGIN
        SELECT @HDNum = SUM(CASE WHEN HD_State='工作日' THEN 1 ELSE -1 END) FROM Holiday 
        WHERE HD_Date BETWEEN @TmpDate AND @DEnd 
          AND NOT ((HD_WeekName = '星期六' OR HD_WeekName = '星期日') AND HD_State = '休息日')
        SET @WorkDay = @WorkDay + @HDNum
      END
    END
    
    RETURN @WorkDay --CASE WHEN @Flag = 1 THEN -@WorkDay ELSE @WorkDay END
END
GO
 
--调用示例
SELECT dbo.fn_WorkDay('2013-06-01', '2013-06-30', DEFAULT)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python计算工作日(排除法定节假日)的方法主要包括以下几个步骤: 1. 首先,我们需要先获取法定节假日的列表,可以通过网络查询或者其他途径获取。法定节假日通常是固定的,例如元旦、春节、劳动节等。 2. 根据获取的法定节假日列表,我们可以创建一个包所有节假日日期的集合。 3. 接下来,我们需要引入datetime模块来进行日期的计算。这个模块提供了处理日期和时间的相关函数和类。 4. 首先,我们可以定义一个函数来计算两个日期之间的天数差。可以使用datetime模块中的date类的substract方法来实现。 5. 然后,我们可以定义一个函数来计算两个日期之间的工作日数量。首先计算两个日期之间的天数差,然后减去周末的天数和法定节假日的天数即可。 6. 最后,我们可以将上述两个函数结合起来,计算出指定日期范围内的工作日数量。 下面是一个示例代码,用于计算2022年3月1日至2022年4月30日之间的工作日数量(排除法定节假日): ```python import datetime public_holidays = [ # 根据实际情况添加法定节假日的日期 datetime.date(2022, 4, 4), # 清明节 datetime.date(2022, 5, 1) # 劳动节 ] def get_working_days(start_date, end_date): days = (end_date - start_date).days + 1 working_days = days for i in range(days): date = start_date + datetime.timedelta(days=i) if date.weekday() >= 5 or date in public_holidays: working_days -= 1 return working_days start_date = datetime.date(2022, 3, 1) end_date = datetime.date(2022, 4, 30) working_days = get_working_days(start_date, end_date) print(f"工作日数量:{working_days}") ``` 上述代码中,我们首先定义了一个public_holidays列表,其中包了2022年的清明节和劳动节日期。然后,我们通过get_working_days函数计算了2022年3月1日至2022年4月30日之间的工作日数量,并将结果打印输出。 这样,我们就可以用Python计算工作日(排除法定节假日)了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值