【发布时间】:2015-09-15 16:11:33
【问题描述】:
我使用以下查询来获取 SQL 中的重叠记录:
SELECT QUOTE_ID,FUNCTION_ID,FUNCTION_DT,FUNC_SPACE_ID,FN_START_TIME,FN_END_TIME,DATE_AUTH_LEVEL
FROM R_13_ALL_RESERVED A
WHERE
A.FUNC_SPACE_ID = '401-ZFU-52'
AND A.FUNCTION_DT = TO_DATE('09/03/2015','MM/DD/YYYY')
AND EXISTS ( SELECT 'X'
FROM R_13_ALL_RESERVED B
WHERE A.PROPERTY = B.PROPERTY
AND A.FUNCTION_DT = B.FUNCTION_DT
AND A.FUNCTION_ID <> B.FUNCTION_ID
AND ( ( A.FN_START_TIME > B.FN_START_TIME
AND A.FN_START_TIME < B.FN_END_TIME)
OR ( B.FN_START_TIME > A.FN_START_TIME
AND B.FN_START_TIME < A.FN_END_TIME)
OR ( A.FN_START_TIME = B.FN_START_TIME
AND A.FN_END_TIME = B.FN_END_TIME)
)
)
但即使日期不重叠,它仍会将记录返回为重叠。
我在这里遗漏了一些东西?
另外,如果日期记录重叠,我需要将function_id 记录的计数与DATE_AUTH_LEVEL 进行比较,如果2 个function_id 记录重叠并且function_id 的计数为2,DATE_AUTH_LEVEL 为1,这样的记录应该在结果集中。
请在 SQLFiddle 中查找数据集 http://sqlfiddle.com/#!9/95874/1
期望的输出: SQL 应该返回重叠的 FN_START_TIME 和 FN_END_TIME 的 function_space_id 和它的 function_dt
在提供的示例中,函数空间 id '401-ZFU-12' 和 function_dt 'August, 15 2015' 的行 5 和 6 重叠,其他所有不重叠
【问题讨论】:
-
您好,下次尝试提供SqlFiddle,这样我们可以更好地理解问题并更快地给您答案——也请阅读How to ask和How to create a Minimal, Complete, and Verifiable example.
-
我不明白为什么它会显示错误的重叠,但最好的重叠检查只是
(a.start_time < b.end_time and b.start_time < a.end_time)- 请参阅this explanation -
您应该同时提供样本数据和期望输出
-
我在使用 SQL fiddle 时遇到了一些困难,我会尽快提供详细信息
-
@user2999377 你为 MySql 创建一个小提琴而不是 Oracle 尝试 this fiddle 代替