【问题标题】:DATEDIFF - How to exlude Company HolidaysDATEDIFF - 如何排除公司假期
【发布时间】:2017-08-03 20:06:15
【问题描述】:

我有一个公司日历表,其中包含公司假期的指标。我需要从 datediff 中排除周末和假期。以下是我的完整查询。

例如 警报日期 2016 年 12 月 23 日 创建日期 2016 年 12 月 28 日 公司假期 12/26/16

下面的查询应该显示 2 个工作日,而不是 3 个。在这个查询下面,我将发布我遇到问题的假日文章。

SELECT 
A.ALERT_UID,
A.ALERTCREATEDT_MMDDYYYY, 
S.CreatedDate,

DATEDIFF(DD,A.ALERTS_CREATE_DT,S.CreatedDate) 
           -(DATEDIFF(WK,A.ALERTS_CREATE_DT,S.CreatedDate) * 2)  
             -(CASE WHEN DATENAME(DW,A.ALERTS_CREATE_DT)   = 'Sunday'  THEN 1 ELSE 0 END) 
                                                                             -(CASE WHEN DATENAME(DW,S.CreatedDate) = 'Saturday' THEN 1 ELSE 0 END) AS BusinessDays

,DATEDIFF(DD,A.ALERTS_CREATE_DT,S.CreatedDate) 
           -(DATEDIFF(WK,A.ALERTS_CREATE_DT,S.CreatedDate) * 2)  --HOW MANY WEEKEND DAYS PASSED BY
           -(CASE WHEN DATENAME(DW,A.ALERTS_CREATE_DT) = 'Sunday' THEN 1 ELSE 0 END) 
           -(CASE WHEN DATENAME(DW,S.CreatedDate) = 'Saturday' THEN 1 ELSE 0 END) 
           -(CASE WHEN CAL.GRH_HOLIDAY_IND = 'Y' AND CAL.CALENDAR_DATE BETWEEN CAST(A.ALERTS_CREATE_DT AS DATE) AND CAST(S.CreatedDate AS DATE) THEN 1 ELSE 0 END )AS BusinessDays_ExcludingHolidays

FROM  A
FULL OUTER JOIN  S ON A.id= S.id 
INNER JOIN CAL ON  A.ALERTCREATEDT_MMDDYYYY = CAL.CALENDAR_DATE  

WHERE 1=1
AND S.CreatedDate IS NOT NULL
AND A.ALERT_UID = '2'

以下查询中的困难:

-(CASE WHEN CAL.GRH_HOLIDAY_IND = 'Y' AND CAL.CALENDAR_DATE BETWEEN CAST        (A.ALERTS_CREATE_DT AS DATE) AND CAST(S.CreatedDate AS DATE) THEN 1    ELSE 0 END )AS BusinessDays_ExcludingHolidays

【问题讨论】:

    标签: sql-server-2008 datediff


    【解决方案1】:

    您在A.ALERTCREATEDT_MMDDYYYY = CAL.CALENDAR_DATE 上加入您的日历,因此您的表情

    -(CASE WHEN CAL.GRH_HOLIDAY_IND = 'Y' 
            AND CAL.CALENDAR_DATE BETWEEN CAST(A.ALERTS_CREATE_DT AS DATE) 
                                    AND CAST(S.CreatedDate AS DATE) 
        THEN 1
        ELSE 0 
    END
    

    只有在A.ALERTCREATEDT_MMDDYYYY 是假期时才会返回 1。我希望你想要这样的东西:

    SELECT  A.ALERT_UID,
            A.ALERTCREATEDT_MMDDYYYY, 
            S.CreatedDate,
            cal.BusinessDays,
            cal.BusinessDays_ExcludingHolidays
    FROM  A
    FULL OUTER JOIN  S ON A.id= S.id 
    CROSS APPLY
    (   SELECT  TotalDays = COUNT(*),
                BusinessDays = COUNT(CASE WHEN cal.IsBusinessDay = 1 THEN 1 END),
                BusinessDays_ExcludingHolidays = COUNT(CASE WHEN cal.GRH_HOLIDAY_IND = 'Y' THEN 1 END)
        FROM    CAL 
        WHERE   cal.CALENDAR_DATE BETWEEN CAST(A.ALERTS_CREATE_DT AS DATE) AND CAST(S.CreatedDate AS DATE)
    ) cal
    WHERE   1=1
    AND     s.CreatedDate IS NOT NULL
    AND     s.ALERT_UID = '2';
    

    在这里,我假设您的日历表作为 IsBusinessDay 列来标记工作日(或类似的东西 - 如果它不应该)。

    【讨论】:

    猜你喜欢
    • 2017-07-31
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多