zoukankan      html  css  js  c++  java
  • Sql server 查询指定时间区间工作日数、休息日数等日期操作

    1、查询指定时间区间的工作日

    这个主要难点是法定节假日,国家的法定节假日每年都不一样,还涉及到调休,所以我们设计一个假日表。主要字段有年份,类型(是否调休),假期日期。如下:

     CREATE TABLE [dbo].[Holidays](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Holiday] [datetime2](7) NULL,--假期日期
    
    [YearS] [char](4) NULL,--年份
    [daytype] [int] NULL--类型
    
    )
    

      

    添加好当年的假期和调休日期

    写个方法计算出除开法定假日的工作日

    ALTER FUNCTION [dbo].[GetWorkerDays]
    
    (
    
    -- Add the parameters for the function here
    
     @StartTime DATETIME, -- 起始时间
    
     @EndTime DATETIME -- 结束时间,查询默认小于此时间
    
    )
    
    RETURNS INT
    
    AS
    
    BEGIN 
    
    DECLARE @Total INT;
    
    DECLARE @Temp INT;
    
    DECLARE @Days INT;
    
    DECLARE @Index INT;
    
    SET @Days = DATEDIFF(DAY,@StartTime,@EndTime);
    
    SET @Index = 0;
    
    SET @Temp = 0;
    
    SET @Total = 0;
    
    WHILE @Index < @Days BEGIN 
    
    SET @Temp = DatePart(WEEKDAY,DATEADD(DAY,@Index,@StartTime));
    
    IF @Temp > 1 AND @Temp < 7 BEGIN 
    
    SET @Total = @Total + 1;
    
    END 
    
    SET @Index = @Index + 1;
    
    END 
    
    RETURN ISNULL(@Total,0)
    
    END
    
     
    

      

    执行这个表值函数后加上调休日和减去法定假日就是工作日了,大家可以再写一个存储过程。

    2,计算指定日期段的休息日

    这个跟那个相反,就是星期天加上法定假日在减去调休日

    我们写一个函数

    ALTER FUNCTION GetRestDays
    
    (
    
    @StartTime DATETIME2,
    
    @EndTime DATETIME2
    
    )
    
    RETURNS INT
    
    AS
    
    BEGIN
    
    DECLARE @LegalRest INT --法定假期
    
    DECLARE @AdjustmentDay INT--调休上班时间
    
    DECLARE @SurplusDay INT --剩余工作日
    
    DECLARE @CountDay INT --总共天数
    
     
    
    SELECT @LegalRest=COUNT(0) FROM dbo.Holidays WHERE daytype=1 AND  YearS=YEAR(GETDATE()) AND MONTH(Holiday)=MONTH(GETDATE()) 
    
    AND Holiday>=@StartTime AND Holiday<=@EndTime
    
     
    
    SELECT  @AdjustmentDay=COUNT(0) FROM dbo.Holidays WHERE daytype=2 AND  YearS=YEAR(GETDATE()) AND MONTH(Holiday)=MONTH(GETDATE()) 
    
    AND Holiday>=@StartTime AND Holiday<=@EndTime
    
     SET @SurplusDay= [dbo].[GetWorkerDays](@StartTime,DATEADD(DAY,1,@EndTime))--剩余工作日
    
     SELECT @CountDay=COUNT(0) FROM dbo.TimeSpanDays(@StartTime ,DATEADD(DAY,1,@EndTime))  --总共天数  计算出 时间段总共天数
    
     return @CountDay-@SurplusDay+@LegalRest-@AdjustmentDay
    
    END
    

      

    3、计算当前前月初日期和月末日期

    月初

    简单:

    SELECT  CONVERT(VARCHAR(7),GETDATE(),120)+'-01'
    

      

    月末日期

    这个也简单简单:就是月第一天加一月再减去一天

    SELECT   DATEADD(DAY,-1, DATEADD(MONTH,1, CONVERT(VARCHAR(7),GETDATE(),120)+'-01'))
    

      

  • 相关阅读:
    rem 适配
    1px实现方案
    伪类选择器
    css中如何做到容器按比例缩放
    rem移动端适配方案
    Quartz.NET实现作业调度
    iPhone X
    优化hexo访问速度-将hexo部署到云主机VPS
    网页设计命名规范
    网站注册页面
  • 原文地址:https://www.cnblogs.com/xbhp/p/6412059.html
Copyright © 2011-2022 走看看