我正在尝试查找在特定时间段内工作的员工以及他们在该时间段内的工作时间。我的查询必须将员工 id 为 pk 并使用有效日期和过期日期作为员工职位的时间度量的员工表连接到工资期 id 编号为 pk 并且还使用有效日期和到期日期的计时表。
员工表中到期日期的问题是,如果员工当前受雇,则日期为“12/31/9999”。我正在寻找在某一年工作的员工和当前员工以及他们按工资期分开的工作时间。
当我在 OR 语句中将这种情况考虑在内时,我会得到重复的员工,这些员工在我正在寻找的时间段及以后工作,以及“12/31/9999”和有效的重复记录那个时间段的员工。
这是我正在使用的查询:
SELECT
J.EMPL_ID
,J.DEPT
,J.UNIT
,J.LAST_NM
,J.FIRST_NM
,J.TITLE
,J.EFF_DT
,J.EXP_DT
,TM1.PPRD_ID
,TM1.EMPL_ID
,TM1.EXP_DT
,TM1.EFF_DT
--PULLING IN THE DAILY HRS WORKED
,(SELECT NVL(SUM(((to_number(SUBSTR(TI.DAY_1, 1
,INSTR(TI.DAY_1, ':', 1, 1)-1),99))*60)+
(TO_NUMBER(SUBSTR(TI.DAY_1
,INSTR(TI.DAY_1,':', -1, 1)+1),99))),0)
FROM PPRD_LINE TI
WHERE
TI.PPRD_ID=TM1.PPRD_ID
) "DAY1"
---AND THE REST OF THE DAYS FOR THE WORK PERIOD
FROM PPRD_LINE TM1
JOIN EMPL J ON TM1.EMPL_ID=J.EMPL_ID
WHERE
J.EMPL_ID='some id number' --for test purposes, will need to break down to depts-
AND
J.EFF_DT >=TO_DATE('1/1/2012','MM/DD/YYYY')
AND
(
J.EXP_DT<=TO_DATE('12/31/2012','MM/DD/YYYY')
OR
J.EXP_DT=TO_DATE('12/31/9999','MM/DD/YYYY') --I think the problem might be here???
)
GROUP BY
J.EMPL_ID
,J.DEPT
,J.UNIT
,J.LAST_NM
,J.FIRST_NM
,J.TITLE
,J.EFF_DT
,J.EXP_DT
,TM1.PPRD_ID
,TM1.EMPL_ID
,TM1.DOC_ID
,TM1.EXP_DT
,TM1.EFF_DT
ORDER BY
J.EFF_DT
,TM1.EFF_DT
,TM1.EXP_DT
我很确定我错过了一些简单的东西,但在这一点上,我无法只见树木不见森林。那里的任何人都可以指出我正确的方向吗?
重复记录的示例:
对于 2012 年的员工 1:
Empl_ID Dept Unit Last First Title Eff Date Exp Date PPRD ID Empl_ID
00001 04 012 Babbage Charles Somejob 4/1/2012 10/15/2012 0407123 00001
Exp Date_1 Eff Date_1
4/15/2012 4/1/2012
此记录重复 3 次,并超过 2012 年的支付期,直至 2013 年的当前支付期
我用来转换时间的子查询能够将小时和分钟加在一起以进行比较。