Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle中日期值的算术运算_Oracle_Math_Time_Plsql - Fatal编程技术网

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;