我有一个表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
谢谢你的帮助。如果我当前的逻辑完全错误并且我没有解释,请告诉我,我只是想在时钟输出时间异常中查找时钟异常。
答案 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