0

我正在尝试查找在特定时间段内工作的员工以及他们在该时间段内的工作时间。我的查询必须将员工 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 年的当前支付期

我用来转换时间的子查询能够将小时和分钟加在一起以进行比较。

4

1 回答 1

0

我会大胆猜测一下,看看这是否是你想要的,记住我无法测试,所以可能有错别字。

如果是这样,尤其是如果不是,您应该阅读常见问题解答中有关如何提出好问题的信息。如果这是您试图理解的内容,您的问题应该在大约 10 分钟内得到回答。因为不清楚你在问什么,没有人能回答你的问题。

您应该在问题中包含输入和输出以及预期输出。您提供的数据不是 select 语句的输出(它没有 DAY1 列)。

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  Can't have these if you are summing accross multiple records.
--   ,TM1.EFF_DT
   --PULLING IN THE DAILY HRS WORKED
   ,NVL(SUM(((to_number(SUBSTR(TM1.DAY_1, 1,INSTR(TM1.DAY_1, ':', 1, 1)-1),99))*60)+
             (TO_NUMBER(SUBSTR(TM1.DAY_1,INSTR(TM1.DAY_1,':', -1, 1)+1),99))),0)
               "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'))
GROUP BY
    J.EMPL_ID
   ,J.DEPT
   ,J.UNIT
   ,J.LAST_NM
   ,J.FIRST_NM
   ,J.TITLE 
   ,TM1.PPRD_ID
   ,TM1.EMPL_ID
   ,TM1.DOC_ID
ORDER BY
    MIN(J.EFF_DT)
   ,MAX(TM1.EFF_DT)
   ,MAX(TM1.EXP_DT)
于 2013-03-26T14:40:38.360 回答