2012-04-13 72 views
0

情况1:获取时间差两个日期时间之间的甲骨文

p_start_date = 13.Apr.2012 13:00 
p_end_date = 13.Apr.2012 15:00 

working_hours = 0 

// in this Situation working_hours should be 2 

情况2:

p_start_date = 13.Apr.2012 13:00 
p_end_date = 14.Apr.2012 15:00 

working_hours = 24 

// in this Situation working_hours should be 26 

,当我在SQLDevelopperSituation 1Situation 2运行此,对于working_hours值是正确返回。但我在Before Insert Update Trigger中将此过程称为用于我的apex应用程序。当我提交表格的形式Situation 1,对于working_hours值为0,当我提交表格的形式Situation 2,对于working_hours值为24

根据Situation 1Situation 2,两个日期之间的差异分配到working_hours。但我需要的是两次之间的差异。

我怎么能这样做呢?

我的程序计算working_hours是,

PROCEDURE get_labour_cost_data(
p_employee_id IN NUMBER, 
p_start_date IN VARCHAR2, 
p_end_date IN VARCHAR2, 
hours_normal_rate OUT NUMBER, 
working_hours OUT NUMBER, 
total_cost OUT NUMBER) 

AS 

v_employee_rate NUMBER; 

BEGIN 

    if p_employee_id is null then 

    hours_normal_rate := 0; 
    working_hours := 0; 
    total_cost := 0; 

    elsif p_employee_id is not null then 

    -- Get hourse_noraml from employee 
    select HOURLY_SALARY into hours_normal_rate from Employee 
    where EMPLOYEE_ID = p_employee_id; 

    -- Get working hours 
    working_hours := 24 * (to_date(p_end_date, 'dd.mm.rr hh24:mi') - to_date(p_start_date, 'dd.mm.rr hh24:mi')); 

    -- Get Total cost 
    total_cost := nvl(hours_normal_rate,0) * nvl(working_hours,0); 

    end if;  
    END; 

触发器是,

create or replace 
TRIGGER LABOUR_COST_BIU_TRI 
BEFORE INSERT OR UPDATE ON LABOUR_COST 
FOR EACH ROW 
DECLARE 

v_hours_normal NUMBER; 
v_working_hours NUMBER; 
v_total_cost NUMBER; 
BEGIN 

    util.get_labour_cost_data(
    p_employee_id => :NEW.EMPLOYEE_ID, 
    p_start_date => :NEW.START_DATE_TIME, 
    p_end_date => :NEW.END_DATE_TIME, 
    hours_normal_rate => v_hours_normal, 
    working_hours => v_working_hours, 
    total_cost => v_total_cost 
); 

     select v_hours_normal, v_working_hours, v_total_cost into :NEW.HOURS_NOMAL, :NEW.HOURS_OT, :NEW.TOTAL_COST 
    from dual; 

END; 

回答

0

当我创建并运行单独的程序它的工作原理:

declare 
hours_normal_rate NUMBER; 
working_hours NUMBER; 
total_cost NUMBER; 
begin 
get_labour_cost_data(
1, 
'13.Apr.2012 13:00', 
'13.Apr.2012 15:00', 
hours_normal_rate, 
working_hours, 
total_cost); 
dbms_output.put_Line(working_hours); 
END; 

输出:

2 

和:

declare 
hours_normal_rate NUMBER; 
working_hours NUMBER; 
total_cost NUMBER; 
begin 
get_labour_cost_data(
1, 
'13.Apr.2012 13:00', 
'14.Apr.2012 15:00', 
hours_normal_rate, 
working_hours, 
total_cost); 
dbms_output.put_Line(working_hours); 
END; 

输出:

25.99999999999999999999999999999999999992 

(!关闭)

我看不出有任何问题,你使用它的触发方式,尽管这可以简化为:

create or replace 
TRIGGER LABOUR_COST_BIU_TRI 
BEFORE INSERT OR UPDATE ON LABOUR_COST 
FOR EACH ROW 
BEGIN 

    util.get_labour_cost_data(
    p_employee_id => :NEW.EMPLOYEE_ID, 
    p_start_date => :NEW.START_DATE_TIME, 
    p_end_date => :NEW.END_DATE_TIME, 
    hours_normal_rate => :NEW.HOURS_NOMAL, 
    working_hours => :NEW.HOURS_OT, 
    total_cost => :NEW.TOTAL_COST 
); 

END;