oracle时钟查找给定日期范围的异常

时间:2014-09-24 16:48:35

标签: sql oracle date

我有一个表clockin日期和时钟输出日期。

__________________________________________
userid | clockin_date           | clockout_date
------------------------------------------
a1     | '15.SEP.2014 09:24:36' | '16.SEP.2014 06:24:36'
b1     | '15.SEP.2014 09:00:36' | '16.SEP.2014 05:24:36'
b1     | '16.SEP.2014 09:05:36' | '16.SEP.2014 09:54:36'
b1     | '16.SEP.2014 10:24:36' | '17.SEP.2014 06:00:06'
b1     | '18.SEP.2014 09:24:36' | '18.SEP.2014 05:00:00'
-----------------------

我必须在日期中找到例外,如果它超过当前日期并将其标记为两个clockin: 一个16,另一个17。

b1     | '16.SEP.2014 10:24:36' | '17.SEP.2014 06:00:36'

我写了一个查询来查找花费的总时数:

 SELECT userid, TRUNC(clockin), TRUNC(clockout), 
    CASE
      WHEN TRUNC(clockout) != TRUNC(clockin)
      THEN 0
      ELSE ROUND(SUM((clockout - clockin )*24 ),2)
    END totalhours
  FROM TIMECLOCK 
  GROUP BY userid, TRUNC(clockin), TRUNC(clockout)

如果不在同一天,我将其标记为总共0小时。从这个结果来看,我需要提取两个日期之间的范围,结果应该像一个数据透视表,这样我就可以查询总时数并找到异常。

 userid | clockin_date  | totalhours
    ------------------------------------------
    b1  | '15.SEP.2014' |  8.24
    b1  | '16.SEP.2014' |  0
    b1  | '17.SEP.2014' |  0

谢谢你的帮助。如果我当前的逻辑完全错误并且我没有解释,请告诉我,我只是想在时钟输出时间异常中查找时钟异常。

1 个答案:

答案 0 :(得分:0)

所以,我不确定你的意思"我必须在日期中找到例外,如果超过当前日期并将其标记为两个clockin:一个用于16,另一个用于第17个。 "

如果您只想突出显示在不同日期发生clockin和clockouts的任何情况并显示每个不良实例的总小时数,那么它就像

一样简单
SELECT userid
, clockin
, SUM(clockout - clockin)
FROM TIMECLOCK
WHERE TRUNC(clockin) != TRUNC(clockout)
GROUP BY userid, clockin

但是如果你想识别不良实例,然后将它们的时间与具有相同clockin日期的良好实例相结合,那么你可以这样做:

SELECT userid
, TRUNC(clockin)
, Min(clockin)
, MAX(clockout)
, Round(SUM(clockout - clockin)*24,2) Total_Hours
FROM TIMECLOCK
GROUP BY userid, TRUNC(clockin)
HAVING TRUNC(clockin) != TRUNC(MAX(clockout))
order by userid, TRUNC(clockin)

SqlFiddle Here:http://sqlfiddle.com/#!4/7ff2e/3

(我还应该提一下,你发布的clockin / out日期似乎存在问题,因为它们看起来像12小时的时钟戳,应该在字符串中有AM / PM。我做了所有的时钟输出PM in sqlfiddle。)


扩展我的评论如果您正在寻找类似于'每当用户在预期工作日没有时钟条目时突出显示的内容'然后你可以尝试这样的事情:http://sqlfiddle.com/#!4/88a81a/3