我需要获取 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 日期或任何可以解释这种奇怪行为的东西时,我是否必须考虑任何考虑因素?