日曆表真的會幫你在這裏。假設每個日曆日期有一條記錄,則可以使用此表來記錄週末,節假日,財政週期與日曆週期,月初/月末日期開始。許多事情可以幫助簡化基於日期的查詢。
See this question here for an example on creating a calendar table.
主要的一點是要創建一個數據集,每1日的記錄,大約每個日期,包括月份,星期,節日狀態信息等
沒有日曆表,您可以使用數據庫函數來即時生成一組日期。
入門的日期的月份數可以用
extract([Month], <date field goes here>)
獲取從一無所有值的列表將被要求生成日期的列表(如果你沒有日曆表1來完成記錄每個日期使用)將取決於您的源數據庫。在oracle中,我使用'從all_objects中選擇'類型查詢來實現這一點。
從Ask Tom:
select to_date(:start_date,'dd-mon-yyyy') + rownum -1
from all_objects
where rownum <=
to_date(:end_date,'dd-mon-yyyy')-to_date(:start_date,'dd-mon-yyyy')+1
For Sql Server refer to this stackoverflow question here.
一個例子。一旦你有一個數據集與您的日曆類型的信息,你可以把它加入到你上面的查詢:
join mycalendar cal on cal.date >= c.PTOStartDate
and cal.date <= c.PTOEndDate
還要注意,_add_days是一個Cognos函數。在構建源查詢時,嘗試使用Native函數,就像在oracle中一樣,你可以'c.PTOStartDate + a.PTODays'。將Cognos功能與本機功能混合有時會迫使部分查詢在Cognos服務器上本地處理。一般來說,數據庫上發生的工作越多,報告運行得越快。
一旦你加入到日曆數據,你將有你的記錄倍增,以便你有每個日期1記錄。 (您不希望在此處對PTTays進行任何彙總數學運算,因爲它將被誇大。)
現在您可以添加子句來跟蹤您的規則。
where cal.Day_Of_Week between 2 and 6
and cal.Is_Holiday = 'N'
現在,如果你是拉一個特定的月份,您可以添加到標準:
and cal.CalendarPeriod = '201508'
或者,如果你是覆蓋更長的時間,但希望報告,每月一總結,你可以按月分組。
最終的查詢可能是這個樣子:
select c.UserID, cal.CalendarPeriod, count(*) PTO_Days
from dbo.PTOCalendar c
join myCalendar cal on on cal.date >= c.PTOStartDate
and cal.date <= c.PTOEndDate
where cal.day_of_week between 2 and 6
and cal.Is_Holiday = 'N'
group by c.UserID, cal.CalendarPeriod
所以,如果員工與用戶ID 1234花了7天的假期從週四6月25日至星期五7月3,第涵蓋9天,結果你在這裏會成爲:
1234 201506 4
1234 201507 3
您可以將這些結果加入到上面的最終查詢中,以跟蹤每個月的休息日。