-1

我需要获取 2 个日期字段的差异,如果较大的日期为空,那么我将使用它SYSDATE。有这个需求,我创建了一个函数来解决这个问题(注意:此代码遵循组织的标准,不是我个人的口味)

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函数已经存在并计算一天的工作时间(假设没有人在上午 12 点工作,诸如此类)。问题是在调用此函数时,结果包含额外的时间。这很奇怪,因为在函数中执行查询时,它返回了预期的输出。

示例(重要:秘鲁的日期格式为DD/MM/YYYY HH24:MI:SS

TABLEX

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

假设服务器日期是同一天(01/12/2012)但更大的时间(10:01:00),我们执行函数:

SELECT F_GET_DIFFERENCE(1)
FROM DUAL;

结果是:14。

现在,在函数中执行查询并让服务器时间为 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

2 回答 2

0

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

于 2012-12-08T17:50:37.493 回答
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
/
于 2012-12-10T15:17:02.170 回答