【发布时间】:2020-01-29 13:52:54
【问题描述】:
作为我的标题,我有以下代码:
SELECT
*
FROM
de.Department
WHERE
de.flag = 1
AND de.DepartmentNum IN (10,4)
AND de.status IN (0,-1,100)
AND datediff('dd',de.datequit,'30-SEP-19') > 9
datediff 函数使我的查询运行非常慢(11 条记录需要 16 秒),而且成本也非常高(~43k)。
这是我的 datediff 函数代码
create or replace FUNCTION DATEDIFF
(
P_TYPE_DATE IN VARCHAR2
, P_START_DATE IN TIMESTAMP
, P_END_DATE IN TIMESTAMP
) RETURN NUMBER AS
v_Result NUMBER := -1;
BEGIN
IF P_TYPE_DATE IS NOT NULL AND P_START_DATE IS NOT NULL AND P_END_DATE IS NOT NULL THEN
CASE UPPER(P_TYPE_DATE)
WHEN 'DD' THEN RETURN ROUND(TRUNC(P_END_DATE,'DD') - TRUNC(P_START_DATE,'DD'),0);
WHEN 'HH' THEN RETURN ROUND((TRUNC(P_END_DATE,'HH') - TRUNC(P_START_DATE,'HH')) * 24,0);
WHEN 'MI' THEN RETURN ROUND((TRUNC(P_END_DATE,'MI') - TRUNC(P_START_DATE,'MI')) * 24 * 60,0);
WHEN 'SS' THEN RETURN ROUND((TRUNC(P_END_DATE,'MI') - TRUNC(P_START_DATE,'MI')) * 24 * 60 * 60 + extract(second from (P_END_DATE - P_START_DATE)),0);
ELSE RETURN NULL;
END CASE;
END IF;
RETURN NULL;
EXCEPTION
WHEN OTHERS THEN
raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR- '||SQLERRM);
END DATEDIFF;
我使用 SELECT * 是因为我想在 Department 表中获取几乎列,所以如果我 SELECT 一些我需要的列,它就不会再改变了。
我可以重写以提高性能和成本吗?
谢谢!
【问题讨论】:
-
我假设您错误地标记了它并且实际上正在使用 SQL Server。它是一个已知问题。此页面上列出了一些替代方案。 sqltouch.blogspot.com/2013/11/…
-
Oracle has no
datediff()您的查询将根本不会运行 - 并且会因错误而失败。 -
@a_horse_with_no_name 我在 SQL 中创建了一个名为 datediff 的函数作为 datediff 函数,先生
-
@thewindlove123 那么你的问题应该是“为什么我的 DATEDIFF 函数这么慢”并贴出 DATEDIFF 函数代码
-
@CathalMF 我添加了代码,感谢您的建议
标签: sql oracle plsql oracle12c datediff