Sqlserver计算本年度工作日

本文介绍了一种使用SQL语言来创建和填充一个临时表的方法,该表包含了一整年的日期信息,并根据公司的休假安排标记了每个日期是否为工作日。通过与节假日配置表的连接更新临时表中的工作状态。
 --@StartDate 本年度第一天
  --@EndDate   本年度最后一天
  DECLARE @StartDate DATETIME = DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) 
  DECLARE @EndDate DATETIME = DATEADD(ms, -3,
                                      DATEADD(yy,
                                              DATEDIFF(yy, 0, GETDATE()) + 1,
                                              0))  
  IF EXISTS ( SELECT    *
              FROM      tempdb..sysobjects
              WHERE     id = OBJECT_ID('tempdb..#tb_work') ) 
    BEGIN       
        DROP TABLE  #tb_work      
    END       
  CREATE TABLE #tb_work
    (
      RN INT ,
      WorkDate DATE ,--日期
      DeWeek NVARCHAR(10) ,--星期几
      IsWork NVARCHAR(10)  --是否上班
    )  
  INSERT    INTO #tb_work
            ( RN ,
              WorkDate ,
              DeWeek  
            )
            SELECT  ROW_NUMBER() OVER ( ORDER BY CAST(DATEADD(day, number,
                                                              @StartDate) AS DATE) ) ,
                    CAST(DATEADD(day, number, @StartDate) AS DATE) AS dt ,
                    DATENAME(WEEKDAY,
                             CAST(DATEADD(day, number, @StartDate) AS DATE))
            FROM    master.dbo.spt_values
            WHERE   type = 'P'
                    AND number <= DATEDIFF(day, @StartDate, @EndDate)
                    
            SELECT * FROM #tb_work;

下面根据自己数据库配置的情况更新表中的“是否上班”的字段

例如我们有个配置表如下:

我们先把配置表里的节假日信息数据填充到临时表

UPDATE  tw WITH(ROWLOCK)
SET     tw.IsWork = TB.IsShipment
FROM    #tb_work tw WITH ( ROWLOCK )
        INNER JOIN EDI_BaseHoliday tb ON Tw.WorkDate = tb.Holiday

由于我们公司除配置表配置的节假日外,周末是休息的,那么将临时表中没更新“是否工作日”的字段进行update

     UPDATE #tb_work
     SET    IsWork = ( CASE WHEN DeWeek = '星期六'
                                 OR DeWeek = '星期日' THEN 'N'
                            ELSE 'Y'
                       END )
     WHERE  ISNULL(IsWork, '') = '' 

这样本年度的节假日信息就出来了

 

转载于:https://www.cnblogs.com/evanmemo/p/9329457.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值