Oracle中Date值的算术运算

时间:2013-09-11 07:34:17

标签: oracle math time plsql

我正在努力解决一些问题...

有表格,其中我有员工出勤记录,例如:

代表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

特别是,我想要一些带有EmpIDDATE参数的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)

1 个答案:

答案 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;