2012-12-08 40 views
-1

我需要获取2个日期字段的差异,如果更大的日期为空,那么我将使用SYSDATE来代替。有了这个需求,我创建了解决这个问题(注:此代码将按照组织的标准,而不是我个人的口味)的函数日期差异得到不同于select语句的结果

CREATE FUNCTION F_GET_DIFFERENCE (P_WORKFLOWID NUMBER) 
RETURN NUMBER --result in minutes 
IS 
    TIME NUMBER; 
BEGIN 
    TIME := 0 
    SELECT 
     F_WORKTIME_DIFF(NVL(X.ENDDATE, SYSDATE), X.STARTDATE) 
    INTO 
     TIME 
    FROM 
     TABLEX X 
    WHERE 
     X.WORKFLOWID = P_WORKFLOWID; 

    RETURN TIME; 
EXCEPTION 
    WHEN OTHERS THEN 
     RETURN 0; 
END; 

F_WORKTIME_DIFF功能已经存在,并计算一天的工作时间(assumming没有人在上午12点工作,以及类似的事情)。问题是当调用这个函数时,结果会包含额外的时间。这很奇怪,因为在函数中执行查询时,它会返回预期的输出。

实施例(重要的是:在秘鲁日期格式是DD/MM/YYYY HH24:MI:SS

TABLEX 

WORKFLOWID  STARTDATE    ENDDATE 
    1    '01/12/2012 10:00:00'  null 

Assumming服务器一天是在同一天(2012年1月12日),但更长的时间(10点01分00秒),我们执行功能:

SELECT F_GET_DIFFERENCE(1) 
FROM DUAL; 

结果是:14.

现在,执行所述函数的查询和具有服务器吨ime在10:02:00,结果是2(确切输出)。

我甚至尝试执行此

SELECT 
    F_WORKTIME_DIFF(NVL(X.ENDDATE, SYSDATE), X.STARTDATE) SELECT_WAY, 
    F_GET_DIFFERENCE(1) FUNCTION_WAY 
FROM 
    TABLEX X 
WHERE 
    X.WORKFLOWID = 1 

,其结果是(具有10:10:00服务器时间)

SELECT_WAY FUNCTION_WAY 
    10    24 

也许是我必须考虑到当任何代价与Oracle一起工作的日期在内部函数或任何可以解释这种奇怪行为的东西?

+4

投掷石头和隐藏的手?请至少发布为什么downvote。 –

+0

另一个*只是想downvote你的问题绝不*没有评论? –

回答

0

如果没有看到函数F_WORKTIME_DIFF就很难说出任何内容。 无论从F_WORKTIME_DIFF返回的数据类型是什么,在分配给变量time时,它都会被输出到number。这可能是一个线索。

+0

如果你检查我的最后一个例子,我在'F_GET_DIFFERENCE'函数内部使用了'F_WORKTIME_DIFF'函数,并且在select语句中使用了'F_WORKTIME_DIFF'函数,并且我得到了2个不同的结果,这让我觉得这个方法没有涉及错误的输出。 –

0

这可能不是正是你寻找,但第一个例子给你时间两个日期之间的差异:

Select EXTRACT(HOUR FROM (SYSDATE - trunc(SYSDATE)) DAY TO SECOND) From dual 
/

Select 
    EXTRACT(hour From Cast(SYSDATE as timestamp)) hh, 
    EXTRACT(minute From Cast(SYSDATE as timestamp)) mi, 
    EXTRACT(second From Cast(SYSDATE as timestamp)) ss 
From dual 
/