【发布时间】:2013-05-03 00:47:38
【问题描述】:
我有一个表格,其中列出了员工活跃/不活跃的日期,我想计算员工在特定日期范围内活跃的周数。
所以表 (ps_job) 将具有如下值:
EMPLID EFFDT HR_STATUS
------ ----- ------
1000 01-Jul-11 A
1000 01-Sep-11 I
1000 01-Jan-12 A
1000 01-Mar-12 I
1000 01-Sep-12 A
查询需要向我显示此 empid 从 2011 年 7 月 1 日到 2012 年 12 月 31 日活跃的周数。
所需的结果集是:
EMPLID WEEKS_ACTIVE
------ ------------
1000 35
我通过添加以下 SQL 的结果得到数字 35:
SELECT (NEXT_DAY('01-Sep-11','SUNDAY') - NEXT_DAY('01-Jul-11','SUNDAY'))/7 WEEKS_ACTIVE FROM DUAL;
SELECT (NEXT_DAY('01-Mar-12','SUNDAY') - NEXT_DAY('01-Jan-12','SUNDAY'))/7 WEEKS_ACTIVE FROM DUAL;
SELECT (NEXT_DAY('31-Dec-12','SUNDAY') - NEXT_DAY('01-Sep-12','SUNDAY'))/7 WEEKS_ACTIVE FROM DUAL;
问题是我似乎无法弄清楚如何创建一个查询语句,该语句将遍历特定日期范围内每个员工的所有行,并只返回每个 empid 以及它们处于活动状态的周数。我更喜欢使用基本 SQL 而不是 PL/SQL,以便我可以将其传输到可由用户运行的 PeopleSoft 查询,但如果需要,我愿意使用 Oracle SQL Developer 为用户运行它。
数据库:Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
【问题讨论】:
-
您能更好地解释您的需求吗?您的表中可以有多个条目,对吗?我的意思是,您每周都会存储员工是否活跃?还是每个月??
-
因此,每当雇用或终止员工时,都会更新该表。在这种情况下,员工于 2011 年 7 月 1 日被聘用,因此他们的 HR_STATUS 为 A(ctive)。然后他们在 2011 年 9 月 1 日被终止,所以他们的 HR_STATUS 是 I(nactive)。然后他们在 2012 年 1 月 1 日被重新雇用,2012 年 3 月 1 日再次被终止,然后在 2012 年 9 月 1 日重新雇用,直到今天仍然活跃。这是一个极端的例子,但显示了员工在活动和非活动之间来回切换如何使查询变得更加困难。
-
在您的示例中,您试图将日期推到星期日。假设一名员工在本周的星期五(2013 年 5 月 10 日)被雇用并在下周的星期一(2013 年 5 月 13 日)终止。他们的“周数”可以是 0(3 天四舍五入 = 0 周)、1(3 天 = 一周的一部分)或 2(在两个不同的周内活动)。您要举报哪个?
-
这是个好问题。我不知道客户会如何回答这个问题,所以我会给出我最好的猜测。在这种情况下,我会说 1。他们现在只想要一个粗略的估计。我希望我能说得更明确一点。
标签: sql oracle oracle11g peoplesoft