2012-04-13 103 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;