0

我正在为某些情况而苦苦挣扎...

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

对于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

特别是,我想要一些带有EmpIDandDATE参数的 fn/procedure,然后基于这些数据,如果我要写:select proc(EmployeeID, Date) from dual(or maybe some other table?)它应该做这样的工作:

取表中的第一对(表按默认顺序升序),然后计算从第一个输出(11:23)到第一个输入(9:22)的时间,将该时间保存在某处(int tempResult),然后计算第二对,并计算第二个 tempResult 并在 finalResult 中计算总时间,例如finalResult+=finalResult+tempResult(如果它是循环中的迭代);

我认为它会以某种方式完成,例如,在 foreach (或任何它在 pl/sql oracle 中的任何内容)中,首先选择具有最高结果的选择,然后,第二个......等等......并且在每次迭代中计算期望目标。

所以..我认为逻辑对我来说没问题:),但问题是我对PL/SQL不太熟悉,如果它是用Java编写的,对我来说应该很容易。

我会非常感谢会帮助我的人...

今天对我来说至关重要。

提前致谢。


我有日期和时间是单独的列,例如:

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)
4

1 回答 1

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;
于 2013-09-11T07:59:20.253 回答