2016-04-12 29 views
1

工作工作日內從日曆表我有兩個表得到的SQL Server

一是假期學校明智一月月2010年和其他的列表日曆表。

我想在2010年一月

計算的三所學校的工作日內的數據我從真正的問題只是一個小例子。

假期表

SchoolID HolidayOn  
1   01-01-2010   
1   02-01-2010  
2   01-01-2010 
2   02-01-2010 
3   01-01-2010 
3   02-01-2010  
3   03-01-2010 

我想這三所學校的工作日內

輸出應該是這樣的

SchoolID WorkingDays 
1   03-01-2010 
1   04-01-2010 
1   05-01-2010 
1   06-01-2010 
. 
. 
. 
. 
1   31-01-2010 
2   03-01-2010 
2   04-01-2010 
2   05-01-2010 
2   06-01-2010 
. 
. 
. 
2   31-01-2010 
3   04-01-2010 
3   05-01-2010 
3   06-01-2010 
3   07-01-2010 
. 
. 
. 
. 
3   31-01-2010 

我已經試過這樣的事情

SELECT C.CalendarDate, H.HolidayOn 
     FROM Calendar as C LEFT OUTER JOIN Holidays as H 
    ON C.CalendarDate = H.HolidayOn 
WHERE H.HolidayOn IS NULL 
AND YEAR(C.CalendarDate) IN (2011) 
ORDER BY C.CalendarDate 

我怎樣才能一年執行這些?

謝謝!

+1

日曆表Felix – Kate

+0

加入Craig,請立即檢查 – Kate

回答

0

首先,從Holidays表中獲得所有不同的SchoolID。然後在Calendar表上執行CROSS JOIN以生成學校和日曆日期的所有組合。然後使用NOT EXISTS來過濾假期。

SELECT 
    s.SchoolID, 
    c.CalendarDate 
FROM(
    SELECT DISTINCT SchoolID FROM Holidays 
)s 
CROSS JOIN Calendar c 
WHERE 
    NOT EXISTS(
     SELECT 1 
     FROM Holidays h 
     WHERE 
      h.SchoolID = s.SchooldID 
      AND h.HolidayOn = c.CalendarDate 
    ) 
    AND c.CalendarDate >= '20110101' 
    AND c.CalendarDate < '20120101' 

避免使用YEAR(CalendarDate),因爲它會阻止您的查詢使用索引。請使用>=<

0

如果您對所有學校的所有日期,它是一個簡單的問題:

SELECT d.SchoolId, d.CalendarDate 
FROM AllDatesAllSchools d 
EXCEPT 
SELECT h.SchoolId, h.HolidayOn 
FROM HolidayDates 

但是,你只有所有的日期;不是所有學校的所有日期。所以,你首先產生做一個交叉聯接在日曆和AllSchools作爲CTE:

;WITH AllSchools AS (
    SELECT DISTINCT SchoolId 
    FROM Holidays 
), AllDatesAllSchools AS (
    SELECT h.SchoolId, d.CalendarDate 
    FROM Holidays h 
      CROSS JOIN Calendar d 
) 
SELECT d.SchoolId, d.CalendarDate 
FROM AllDatesAllSchools d 
WHERE d.CalendarDate >= '20110101' 
    AND d.CalendarDate < '20120101' 
EXCEPT 
SELECT h.SchoolId, h.HolidayOn 
FROM Holidays h 

注:請注意,我已經過濾CalendarDate某一特定年份的方法是非常謹慎的。因爲您已經使用YEAR(d.CalendarDate)使查詢不可SARGable,並且無法利用性能指標。