如何使用月末个人休假日?

时间:2015-08-27 23:04:33

标签: cognos cognos-10 cognos-bi

使用PTO的开始日期和结束日期 - 个人休息日使用仅计算截至上个月末的使用天数,不包括该月的周末和美国假期。假期的例子是2015年9月7日在美国。

我的目标是:

  1. 创建数据项月末使用的个人时间。
  2. 当然应该只获得上个月使用的PTO天数。
  3. 在某个月内排除周末。因此,如果资源在星期五和周一休假,则不应在计算中排除星期六和星期日。
  4. 如何排除美国假期,如果这可能很好,但如果不可能,那么我可以使用数字1,2和3。
  5. 我创建了一个数据项列,用于捕获使用的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

1 个答案:

答案 0 :(得分:0)

日历表真的会帮助你。假设每个日历日期有一条记录,您可以使用此表记录周末,假日,财政期间与日历期间,月初/月末日期。许多有助于简化基于日期的查询的事情。

See this question here for an example on creating a calendar table.

重点是创建一个每个日期有1条记录的数据集,其中包含每个日期的信息,包括月份,星期几,假期状态等。

如果没有日历表,您可以使用数据库函数动态生成日期集。

可以使用

获取日期的月份编号
extract([Month], <date field goes here> ) 

生成您的日期列表(如果您没有日历表,每个日期使用1条记录)将需要从无需获取值列表,具体取决于您的源数据库。在oracle中,我使用了从all_objects中选择的&#39;类型查询来实现这一点。

来自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&#39;。将Cognos函数与本机函数混合有时会强制部分查询在Cognos服务器上进行本地处理。一般来说,数据库上发生的工作越多,报告的运行速度就越快。

加入日历数据后,您的记录将成倍增加,以便每个日期有1条记录。 (你不希望在这里对PTODay进行任何汇总数学运算,因为它会被夸大。)

现在您可以添加子句来跟踪规则。

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

因此,如果使用UserID 1234的员工从6月25日星期四到7月3日星期五休假7天,那么您将在此处获得结果:

1234    201506    4
1234    201507    3

您可以将这些结果加入到上面的最终查询中,以跟踪每月的休假日期。