【发布时间】:2016-02-19 14:30:47
【问题描述】:
我需要从表格中获取一个日期并计算一个新的日期,该日期是工作日的增量。目前该代码不考虑节假日,只考虑周六和周日。
我是 Oracle 的新手,但仍在为它的工作原理而苦恼。我需要一些帮助。
我有一个执行日期计算的脚本。在我的示例中,它只是计算距当前日期 15 天的日期。代码如下:
SELECT sysdate,
(SELECT dt from
(SELECT dt, RANK() OVER (ORDER BY dt) pos
FROM (SELECT TRUNC(sysdate) + LEVEL dt,
CASE
WHEN TRIM (TO_CHAR (sysdate + LEVEL, 'DAY')) = 'SATURDAY'
or TRIM (TO_CHAR (sysdate + LEVEL, 'DAY')) = 'SUNDAY'
THEN 0
ELSE 1
END cnt
FROM DUAL
CONNECT BY LEVEL < 30)
WHERE cnt = 1)
WHERE pos = 15) as myDate
FROM DUAL;
结果是当前日期和未来 15 个工作日后的日期。
然后我尝试将其包含在我的表的 SELECT 中。目标是从表中的每条记录中获取日期并执行计算。代码如下:
SELECT assgn_id, assgn_date,
(SELECT dt from
(SELECT dt, RANK() OVER (ORDER BY dt) pos
FROM (SELECT TRUNC(assgn_date) + LEVEL dt,
CASE
WHEN TRIM (TO_CHAR (assgn_date + LEVEL, 'DAY')) = 'SATURDAY'
or TRIM (TO_CHAR (assgn_date + LEVEL, 'DAY')) = 'SUNDAY'
THEN 0
ELSE 1
END cnt
FROM DUAL
CONNECT BY LEVEL < 30)
WHERE cnt = 1)
WHERE pos = 15) as due_date
FROM sales_assgn;
我从中得到的是一个包含 sales_assgn 表中所有条目的列表。第一个结果行有一个很好的 due_date 计算。但是,输出中的每个其他条目都具有与第一行相同的到期日期。所以显然子查询并没有对每条记录执行。
我需要做什么才能使其正常工作。
【问题讨论】:
-
我怀疑您的查询是否有效。因为 assgn_date 不能用于内部查询。您确定您在此处粘贴了正确的查询吗?
-
我很惊讶它竟然运行了,因为你访问了
assgn_date这么多嵌套级别。您使用的是哪个版本的 Oracle? -
我使用的是 11g。它肯定像描述的那样工作。我希望能够用一个函数来做到这一点,但我们不允许添加函数。我尝试将内部级别的 DUAL 更改为 sales_assgn 表,其中将外部级别 id 链接到内部级别。但它只是坐在那里旋转。
-
我知道这是非常低效的。目前,实现一些新功能是一次性的努力。正在运行 sql 以初始化到期日期。将来它将通过应用程序进行维护。我需要从 SQL 执行到期日期的加载,而不是使用 Java 开发加载。所以这整个练习不是我的选择。这是一个了解 Oracle 的机会。这是唯一的好处。
-
如果您的查询确实有效,那么试试这个。您缺少“partition by”,(SELECT dt, RANK() OVER (partition by assgn_date ORDER BY dt) pos FROM (SELECT assgn_date, TRUNC(assgn_date) + LEVEL dt,