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'))
    

      

  • 相关阅读:
    C#编程(七十九)---------- 反射
    C#编程(七十一)---------- 自定义特性
    C#编程(七十六)----------使用指针实现基于栈的高性能数组
    C#编程(七十五)----------C#使用指针
    微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送功能
    [asp.net]c# winform打印类
    Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file
    ValueError: invalid literal for int() with base 10: 'abc'
    检查网址是否正常访问
    Python测试网络连通性示例【基于ping】
  • 原文地址:https://www.cnblogs.com/xbhp/p/6412059.html
Copyright © 2011-2022 走看看