【问题标题】:How to get date ranges according to date data inside database table如何根据数据库表中的日期数据获取日期范围
【发布时间】:2019-08-30 11:00:06
【问题描述】:

我有一个 #TMP 表,其中填满了日期及其相应的备注。它看起来像这样:

Date         isworkdays   isweekdays   
2019-08-16   1            1
2019-08-17   0            0
2019-08-18   0            0
2019-08-19   1            1
2019-08-20   1            1
2019-08-21   1            1
2019-08-22   1            1
2019-08-23   1            1
2019-08-24   0            0
2019-08-25   0            0
2019-08-26   1            1
2019-08-27   1            1
2019-08-28   1            1
2019-08-29   1            1
2019-08-30   1            1
2019-08-31   0            0
2019-09-01   0            0
2019-09-02   1            1
2019-09-03   1            1
2019-09-04   1            1
2019-09-05   1            1
2019-09-06   1            1
2019-09-07   0            0
2019-09-08   0            0
2019-09-09   1            1
2019-09-10   1            1
2019-09-11   1            1
2019-09-12   1            1
2019-09-13   1            1
2019-09-14   0            0
2019-09-15   0            0
2019-09-16   1            1
2019-09-17   1            1
2019-09-18   1            1
2019-09-19   1            1
2019-09-20   1            1
2019-09-21   0            0
2019-09-22   0            0
2019-09-23   1            1
2019-09-24   1            1
2019-09-25   1            1
2019-09-26   1            1
2019-09-27   1            1
2019-09-28   0            0
2019-09-29   0            0
2019-09-30   1            1

Date 列显然是从2019-08-162019-10-16 的一系列日期 isworkingdays 列表示“1”,如果日期是周一到周五,“0”表示周六和周日。 isweekdays 列表示“1”表示日期不是节假日,表示“0”表示节假日。

我想只计算 2019-08-16 到 2019-09-16 之间的天数到 isworkdays = 1 的日期,周六和周日算作 1

这是我到目前为止所做的

declare @userinput date
SELECT SUM(IsWorkDay) AS DayCount FROM AMIFIN..PDC T
 LEFT JOIN dbo.#TMP c ON c.[Date] <= T.Check_Date 
WHERE CAST(@userinput AS Date) <= CAST((c.[Date]) as date) AND c.IsWorkDay = 1 

但它返回 3952743 天

【问题讨论】:

  • and for saturday and sunday count it as 1 ...这实际上是什么意思?您能否根据给定示例数据中包含的日期范围显示示例输出?
  • 对于正常的日子,比如从周一到周五,它被计为 1,但对于周六和周日而不是单独计算,它应该被计为 1。

标签: sql-server


【解决方案1】:

条件聚合应该在这里工作:

SELECT
    SUM(CASE WHEN isworkdays = 1 THEN 1 ELSE 0.5 END) AS DayCount
FROM AMIFIN..PDC T
LEFT JOIN dbo.#TMP c
    ON c.[Date] <= T.Check_Date 
WHERE
    @userinput < c.[Date];

这里的想法是将 1 表示为工作日,将 1/2 表示为周末。半数逻辑是必要的,因为我们最终可能会计算出奇数的周末天数。

【讨论】:

    【解决方案2】:

    我已经想通了。感谢所有发布答案的人,这给了我很多想法。

    这是我的解决方案:

    Declare @cnt INT = 0
    DECLARE @postponedate date = cast('2019-08-20' as date); --Will be the current date of postponement
    DECLARE @checkdate date = cast('2019-08-27' as date); --Date of the check
    Declare @fdate date = (select [Date] FROM #TMP WHERE [Date] = @checkdate); --dates to be compared
    
    
    WHILE @postponedate <= @fdate
    BEGIN
        DECLARE @IsWorkDay INT = (select IsWorkDay FROM #TMP WHERE cast([Date] as date) = @postponedate)
        DECLARE @IsWeekDay INT = (select IsWeekDay FROM #TMP WHERE cast([Date] as date) = @postponedate)
    
            SET @cnt = CASE WHEN @IsWorkDay = 1 THEN
                @cnt + 1 
            ELSE
                @cnt + 0.5
            END
    
            SET @postponedate = DATEADD(Day, 1, @postponedate)
    
        PRINT @postponedate
        PRINT @cnt
    END
    

    【讨论】:

      【解决方案3】:

      我认为您的查询将是这样的:

       SELECT SUM(DATEDIFF(DAY, date, date) + 1) AS Total
          FROM tbl_TMP
          WHERE date >= '2019-08-16' AND date <= '2019-09-30'
          AND isworkdays=1 AND isweekdays=1
          GROUP BY isworkdays,isweekdays
      

      注意:“+1”因为DATEDIFF 返回INT DataType 中的天数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-12
        • 2021-08-01
        • 1970-01-01
        相关资源
        最近更新 更多