我正在努力解决一些问题...
有表格,其中我有员工出勤记录,例如:
代表empID=1
;
empID time Type date
-------------------------------
1 9:22 in sameday
1 11:23 out sameday
1 14:35 in sameday
1 16:21 out sameday
特别是,我想要一些带有EmpID
和DATE
参数的fn /过程,然后基于这些数据,如果我写的是:select proc(EmployeeID, Date) from dual(or maybe some other table?)
它应该这样做工作:
取表中的第一对夫妇(表按顺序升序为默认顺序),然后计算从第一个OUT(11:23)到第一个IN(9:22)的时间,保存那个时间某处(int tempResult)然后计算第二对,并计算第二个tempResult,在finalResult中,它应该计算总时间,如finalResult+=finalResult+tempResult
(如果它是循环中的迭代);
我认为它会在某种程度上完成,例如,在foreach(或者在pl / sql oracle中的任何内容)中,先选择top结果,然后选择第二个..依此类推......并在每次迭代时计算欲望目标
所以..逻辑对我来说是好的我认为:),但问题是我不熟悉PL / SQL,如果用Java编写它应该对我来说很容易。
我会非常感谢能帮助我的人......
对我来说至关重要。
提前感谢。
我有Date和Time是单独的列,例如:
date time
----------------------
11-09-2013 12:34
所以,我这样做了一点改变
FOR rec IN
( SELECT t.EID, to_char(t.devent_date, 'DD.MM.YY') ||' '|| t.RegTime, t.acttype from turnicate_ie t WHERE t.EID = i_emp_id ORDER BY t.EID
)
LOOP
但是它声明包或函数处于不正确的状态......
(t.devent_date is 11.09.2013, t.RegTime is 16:23)
答案 0 :(得分:2)
下面将介绍如何使用plsql:
你需要使用许多计算总工作时间的逻辑,比如同一时间内的多个输入,多个empId等。
create table my_test ( empId number, log_time date, type varchar2(3));
INSERT INTO my_test VALUES( 1, to_date('11/sep/2013 09:22:00 am', 'dd/mon/yyyy hh:mi:ss am'), 'in');
INSERT INTO my_test VALUES( 1, to_date('11/sep/2013 11:23:00 am', 'dd/mon/yyyy hh:mi:ss am'), 'out');
INSERT INTO my_test VALUES( 1, to_date('11/sep/2013 02:35:00 pm', 'dd/mon/yyyy hh:mi:ss pm'), 'in');
INSERT INTO my_test VALUES( 1, to_date('11/sep/2013 04:21:00 pm', 'dd/mon/yyyy hh:mi:ss pm'), 'out');
CREATE OR REPLACE
FUNCTION total_hours(
i_emp_id IN NUMBER)
RETURN VARCHAR2
IS
l_total_seconds NUMBER := 0;
in_time DATE;
l_total_time VARCHAR2(20);
BEGIN
FOR rec IN
( SELECT log_time, type FROM my_test WHERE empid = i_emp_id ORDER BY log_time
)
LOOP
IF rec.TYPE = 'in' AND in_time IS NULL THEN
in_time := rec.log_time;
END IF;
IF rec.TYPE = 'out' AND in_time IS NOT NULL THEN
l_total_seconds := (rec.log_time - in_time)*24*60*60 + l_total_seconds;
in_time := NULL;
END IF;
END LOOP;
SELECT TO_CHAR(TRUNC(l_total_seconds/3600), 'FM999999990')
|| 'hh '
|| TO_CHAR(TRUNC(mod(l_total_seconds,3600)/60), 'FM00')
|| 'mm '
|| TO_CHAR(mod(l_total_seconds,60), 'FM00')
||'ss'
INTO l_total_time
FROM dual;
RETURN l_total_time;
END;
/
SELECT total_hours(1) from dual;