2017-03-13 9 views
0

Ich habe einen Firmenkalendertisch mit Indikatoren für Betriebsferien. Ich muss Wochenenden und Feiertage von datediff ausschließen. Unten ist meine vollständige Abfrage.DATEDIFF - Wie man Firmenurlaub ausschließt

Zum Beispiel Alarm Datum 12/23/16 Erstellungsdatum 12/28/16 Firma Ferien 12/26/16

Die folgende Abfrage von 2 Werktagen zeigen soll und nicht 3. Unterhalb dieser Abfrage I Ich werde das Holiday-Stück veröffentlichen, wo ich Probleme habe.

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' 

Diffculties in der Abfrage unter:

-(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 

Antwort

0

Sie kommen auf A.ALERTCREATEDT_MMDDYYYY = CAL.CALENDAR_DATE in Ihrem Kalender, so deshalb Ihren Ausdruck

-(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 

wird immer nur 1 zurück, wenn A.ALERTCREATEDT_MMDDYYYY ein Feiertag ist. Ich erwarte, dass Sie so etwas wie:

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

Hier habe ich davon ausgegangen, dass Ihr Kalender-Tabelle als Spalte IsBusinessDay Werktage zu markieren (oder so ähnlich - wenn es nicht der Fall ist es sollte).

+0

Die gleiche Abfrage wurde unter http://stackoverflow.com/questions/42721702/sql-server-2008-exclude-company-holiday-from-datediff/42757086?noredirect=1#comment72686807_42757086 beantwortet –

Verwandte Themen