【问题标题】:Get number of weekends between two dates in SQL获取 SQL 中两个日期之间的周末数
【发布时间】:2019-09-20 19:50:59
【问题描述】:

我需要在 sql 中获取日期之间的周末数作为函数。我已经尝试过,但在逻辑的某个地方卡住了。

CREATE FUNCTION fnc_NumberOfWeekEnds(@dFrom DATETIME, @dTo   DATETIME)

RETURNS INT AS

BEGIN

   Declare @weekends int

   Set @weekends = 0

   While @dFrom <= @dTo Begin

      If ((datepart(dw, @dFrom) = 1))    

                  Set @weekends = @weekends + 1

                  Set @dFrom = DateAdd(d, 1, @dFrom)

   End

   Return (@weekends)

END

【问题讨论】:

  • 您需要指定当边界日期与周末重叠时会发生什么。当您指定周六和周日、周五和周六、周日和周日时会发生什么?

标签: sql-server sql-server-2005


【解决方案1】:

我用几个边缘案例尝试了这个逻辑,它似乎有效。

SELECT DATEDIFF(d, @dFrom, @dTo)/7+1
    + CASE WHEN DATEPART(dw,@dFrom) IN (1,7) THEN -1 ELSE 0 END
    + CASE WHEN DATEPART(dw,@dTo) IN (1,7) THEN -1 ELSE 0 END

您可以根据要如何处理开始或结束日期在周末的情况来更改 CASE 语句。在我的情况下,如果开始或结束日期是周六或周日,我不包括周末。

【讨论】:

    【解决方案2】:

    尝试用这个替换 if 语句:

    If ((datepart(dw, @dFrom) = 1) OR (datepart(dw, @dFrom) = 7))    
    

    您还应该检查周末以获取结果。

    【讨论】:

    【解决方案3】:
    DECLARE @date_from DATETIME,
    @date_to DATETIME
    
    
    /*TEMPORARY TABLE*/
    DECLARE @DATES AS TABLE (
    GDate DATETIME
    )
    SELECT @date_from ='2019-09-10'
    SELECT @date_to ='2019-10-10'
    
    /*DATE GENERATED*/
    WITH dates
    AS (
    SELECT @date_from AS dt
    
    UNION ALL
    
    SELECT DATEADD(D, 1, dt)
    FROM dates
    WHERE dt < @date_to
    )
    
    /*INSERTED DATES INTO TEMP TABLE */
    INSERT INTO @DATES
    SELECT CONVERT(DATETIME, dt) AS Gdate FROM dates
    
    /*Get Records from temp table*/
    SELECT Gdate FROM @DATES
    

    【讨论】:

      【解决方案4】:

      使用下面的逻辑来计算开始日期和结束日期之间的星期六或星期日的数量。

      CREATE FUNCTION dbo.WEEKEND_COUNT
      (
      @Start_Date datetime,
      @End_Date datetime
      )
      RETURNS int   
      AS   
      BEGIN
          Declare @count int = 0;
          while @Start_Date<=@End_Date
              Begin
              IF DatePart(WEEKDAY,@Start_Date) =  1 or DatePart(WEEKDAY,@Start_Date) =  7
              SET @count=@count+1
              SET @Start_Date=DateAdd(d,1,@Start_Date)
              END
      
      return @count 
      END
      

      --使用下面来计算周六和周日的数量

      Select dbo.WEEKEND_COUNT('Your start date','your end date')
      

      【讨论】:

        【解决方案5】:

        这将为您提供两个日期之间的星期日数

        SELECT DateDiff(ww, @dFrom, @dTo) as NumOfSundays
        

        【讨论】:

        • 不,这不会尝试这个 SELECT DateDiff(ww, '2015-03-15', '2015-03-20') as NumOfSundays 3/15/2015 是星期日,这会导致零,不是一。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-22
        • 2012-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        相关资源
        最近更新 更多