2015-08-27 61 views
1

使用PTO的開始日期和結束日期 - 個人休假天數僅使用直至上個月結束的天數,不包括該特定月份的週末和美國節假日。一個假期的例子是2015年9月7日在美國。如何獲得月末個人休息日使用?

我的目標是:

  1. 創建一個數據項使用月末個人休假天數。
  2. 當然,它應該只從前一個月獲取PTO天數USED。
  3. 排除該月的週末。因此,如果資源週五需要休假,並且週一,週六和週日不應排除在計算之外。
  4. 如何排除美國假日,如果這是可能的,是偉大的,但如果它是不可能的,那麼我可以接受的數字1,2和3

我創建了捕獲PTO一個數據項列使用的日子。但是這一年迄今爲止還是不錯的。

enter image description here

Case when [PTO Info].[PTO Audit].[PTOAuditTypeId] = 31571 
    and [PTO Info].[PTO Audit].[TimeOffTypeId] = 31566 
    then [PTO Info].[PTO Audit].[PTODays] 

    when [PTO Info].[PTO Audit].[PTOAuditTypeId]=31572 
    and [PTO Info].[PTO Audit].[TimeOffTypeId] = 31566 
    and [PTO Info].[PTO Audit].[PTODays] < 0 
    then abs([PTO Info].[PTO Audit].[PTODays]) 
else 0 end 

我不知道,如果下面的查詢可以提供幫助。 enter image description here

回答

0

日曆表真的會幫你在這裏。假設每個日曆日期有一條記錄,則可以使用此表來記錄週末,節假日,財政週期與日曆週期,月初/月末日期開始。許多事情可以幫助簡化基於日期的查詢。

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 

您可以將這些結果加入到上面的最終查詢中,以跟蹤每個月的休息日。

相關問題