首页 文章

SQL - 如何使用'datediff'从日期范围中排除周末

提问于
浏览
0

我在获得理想的结果时遇到了一些麻烦,下面是我的逻辑陈述 .

  • 逻辑:计算上个月(2月)完成的每次GRM续订的xx到yy之间的天数,然后取平均值(不包括假期和周末) .

我的查询如下,我一直在玩工作日的计数 . 它有效,但我无法以我想要的方式应用它 .

我正在寻找的结果是识别当前月份的前一个月(本例中为feb),并且从XX到YY的范围计算使用(datediff)的天数,但仅计算工作日 .

--query 1计算平均周期时间(范围内的天数)

select  AVG(1.00 * DATEDIFF(DAY, xx, yy)) AS Avg_DayDiff

FROM Database1.dbo.table1

where month(datecompleted) = month(dateadd(month,-1,current_timestamp))
       and year(datecompleted) = year(dateadd(month,-1,current_timestamp))
       and ApprovalRequiredFrom = 'GRM'

join(
  • 表格查询返回上个月的天数,包括当天的名称 .
select CALENDAR_DATE,
        DAY_NAME,
        YEAR(CALENDAR_DATE) AS cal_year,
        MONTH(CALENDAR_DATE) AS cal_month

from Database1.dbo.table2

where month(CALENDAR_DATE) = month(dateadd(month,-1,current_timestamp))
      and year(CALENDAR_DATE) = year(dateadd(month,-1,current_timestamp))

有小费吗?

谢谢!!

2 回答

  • 2

    一种可能的解决方案是使用CTE填充一系列日期,然后选择 DATEPART(dw, [thedate]) 不在1或7(分别为星期日和星期六)的日期 .

    例如,如果您只想要一个没有周末的日期列表:

    DECLARE @startdate date = --Startdate that you specify. In this case I'll select the first day of the previous month
                              (SELECT DATEADD(MONTH, -1, CAST(DATEADD(DAY, -DAY(GETDATE()) + 1, GETDATE()) as date)))
          , @enddate date   = --Enddate that you specify.  In this case I'll select the last day of the previous month
                              (SELECT DATEADD(DAY, -1, CAST(DATEADD(DAY, -DAY(GETDATE()) + 1, GETDATE()) as date)))
    DECLARE @temp TABLE(thedate date)
    ;
    
    WITH dates_CTE (thedate) as 
    (
      SELECT @startdate
      UNION ALL
      SELECT DATEADD(day, 1, thedate)
        FROM dates_CTE
       WHERE thedate < @enddate
    
    )     
    INSERT INTO @temp
    SELECT thedate 
    FROM dates_CTE
    WHERE DATEPART(dw, [thedate]) NOT IN (1,7) --not a weekend
    
    --continue the main query here
    SELECT * FROM @temp
    

    在您对GRM的查询中,您可以查询@temp中行的计数,其中日期大于'xx'且小于给定GRM的'yy' .

    这里需要注意的是,这并没有考虑到假期 . 如何计算这些对于每个组织是不同的 . 在纯SQL中进行此操作并非不可能,但日历表是最简单的IMO .

  • 1

    您可能真正想要做的是生成一个日历表,这使得各种自定义日期操作几乎是微不足道的 . 幸运的是,这一直存在,我们的一些朋友已经非常友好地为我们收集了大量预先滚动的脚本:How to create a Calendar table for 100 years in Sql

相关问题