使用PTO的开始日期和结束日期 - 个人休息日使用仅计算截至上个月末的使用天数,不包括该月的周末和美国假期。假期的例子是2015年9月7日在美国。
我的目标是:
我创建了一个数据项列,用于捕获使用的PTO天数。但这对今年的年份来说是好事。
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
答案 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
您可以将这些结果加入到上面的最终查询中,以跟踪每月的休假日期。