2013-09-11 2 views
0

Я борюсь с некоторыми случаями ...арифметических операции над значениями Даты в Oracle

есть таблица, в которой у меня есть записи о посещаемости сотрудников, например:

для 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 параметры, а затем на основе этих данных, если я напишу: select proc(EmployeeID, Date) from dual(or maybe some other table?) он должен делать такую ​​работу:

принять первый пары в таблице (таблица упорядочена по возрастанию, как по умолчанию), затем вычисляйте FROM first OUT (11:23) до первого IN (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) 
+0

Если это проще сделать на Java, почему вы хотите сделать это в PL/SQL? –

ответ

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; 
+0

он говорит Ошибки компиляции для FUNCTION TURNICATE_USER.TOTAL_HOURS Ошибка: PLS-00103: встречается символ «END» при ожидании одного из следующих значений: . (* @% & = - +; at in is mod осталось не rem <показатель (**)><> или! = Или ~ => = <= <> и/или подобный подобный2 подобный4 likec между || мультимножитель член субтит. Символ ";" был заменен на "END" для продолжения. Линия: 23 Текст: END IF; –

Смежные вопросы