Oracle中日期值的算术运算
我正在和一些案子斗争 有一个表,我在其中有员工考勤记录,例如: 对于Oracle中日期值的算术运算,oracle,math,time,plsql,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 特别是,我想要一些fn/过程,它将采
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
特别是,我想要一些fn/过程,它将采用EmpID
和DATE
参数,然后基于这些数据,如果我要写:从dual(或者其他一些表?)中选择proc(EmployeeID,DATE)
它应该做这样的工作:
取表中的第一对夫妇(表的顺序是以升序作为默认顺序),然后计算从先出(11:23)到先入(9:22)的时间,将该时间保存在某个地方(int tempResult),然后计算第二对夫妇,并计算第二个tempResult,最后计算总时间,类似于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)
下面将为您提供一些使用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;
/
如果在Java中更容易实现,为什么要在PL/SQL中实现?它表示函数TURNICATE_USER的编译错误。TOTAL_HOURS错误:PLS-00103:在预期以下情况之一时遇到符号“END”:。(*@%&=-+;>在in处是模余数而不是rem或!=或~=>=
SELECT total_hours(1) from dual;