使用查询查找范围内的日期
Find Dates in Range Using Query
我正在尝试使用 Oracle
sql 检查或验证某个范围内的日期,并尝试过类似这样的操作:
SELECT * FROM VW_LEAVEDETAILS m WHERE M.EMPNO = '123456'
AND M.LV_FROM >= '17-OCT-2018' AND M.LV_TO <= '18-OCT-2018';
Date Range: Start - End
20-OCT-2018 - 22-OCT-2018 //This worked when checked
这适用于特定日期范围。但是如果我有以下日期范围怎么办
Date Range: Start - End
22-OCT-2018 - 22-OCT-2018 //Date range 1 - in Database Table
18-OCT-2018 - 22-OCT-2018 //Date range 2 - User input
22-OCT-2018 - 24-OCT-2018 //Date range 2 - User input; Even this should be validated
请参阅上面的 22-OCT-2018 已分配给 数据库 Table 日期范围以及任何时候尝试再次分配,应该抛出错误或至少拉高范围。我正在尝试像这样愚蠢的事情,相反的事情但卡住了:
SELECT * FROM VW_LEAVEDETAILS m WHERE M.EMPNO = '123456'
AND M.LV_FROM >= '17-OCT-2018' AND M.LV_TO <= '18-OCT-2018'
OR M.LV_TO >= '17-OCT-2018' AND M.FROM <= '18-OCT-2018';
N.B: 基本上是请假管理系统。因此,只要在范围内分配了一个日期,它就应该有效。有以下三个条件:
LV_FROM
在用户开始日期和用户结束日期之间
LV_TO
在用户开始日期和用户结束日期之间
LV_FROM
在用户开始日期之前,LV_TO 在用户结束日期之后
编辑建议归功于@Corion - 谢谢。
在我看来,您对与用户输入的范围重叠的所有行都感兴趣。
可以有三种类型的重叠:
LV_FROM
在用户开始日期和用户结束日期之间。
LV_TO
在用户开始日期和用户结束日期之间。
LV_FROM
在用户开始日期之前,LV_TO
在用户结束日期之后。
所以,让我们将这些转化为三个条件:
SELECT * FROM VW_LEAVEDETAILS m WHERE M.EMPNO = '123456'
AND (
(M.LV_FROM between '17-OCT-2018' AND '18-OCT-2018')
or (M.LV_TO between '17-OCT-2018' AND '18-OCT-2018')
or (M.LV_FROM < '17-OCT-2018' AND M.LV_TO > '18-OCT-2018')
);
如果您能提供更多信息和示例数据,可以帮助我们提供更好的答案。
如果你想要重叠,那么逻辑是:
SELECT m.*
FROM VW_LEAVEDETAILS m
WHERE M.EMPNO = '123456' AND
M.LV_TO >= DATE '2018-10-17' AND
M.LV_FROM <= DATE '2018-10-18';
如果一个在第二个结束之前开始,而第一个在第二个开始之后结束,则两个时间段重叠(结束点可能包括也可能不包括,具体取决于您的重叠逻辑)。
我正在尝试使用 Oracle
sql 检查或验证某个范围内的日期,并尝试过类似这样的操作:
SELECT * FROM VW_LEAVEDETAILS m WHERE M.EMPNO = '123456'
AND M.LV_FROM >= '17-OCT-2018' AND M.LV_TO <= '18-OCT-2018';
Date Range: Start - End
20-OCT-2018 - 22-OCT-2018 //This worked when checked
这适用于特定日期范围。但是如果我有以下日期范围怎么办
Date Range: Start - End
22-OCT-2018 - 22-OCT-2018 //Date range 1 - in Database Table
18-OCT-2018 - 22-OCT-2018 //Date range 2 - User input
22-OCT-2018 - 24-OCT-2018 //Date range 2 - User input; Even this should be validated
请参阅上面的 22-OCT-2018 已分配给 数据库 Table 日期范围以及任何时候尝试再次分配,应该抛出错误或至少拉高范围。我正在尝试像这样愚蠢的事情,相反的事情但卡住了:
SELECT * FROM VW_LEAVEDETAILS m WHERE M.EMPNO = '123456'
AND M.LV_FROM >= '17-OCT-2018' AND M.LV_TO <= '18-OCT-2018'
OR M.LV_TO >= '17-OCT-2018' AND M.FROM <= '18-OCT-2018';
N.B: 基本上是请假管理系统。因此,只要在范围内分配了一个日期,它就应该有效。有以下三个条件:
LV_FROM
在用户开始日期和用户结束日期之间
LV_TO
在用户开始日期和用户结束日期之间
LV_FROM
在用户开始日期之前,LV_TO 在用户结束日期之后
编辑建议归功于@Corion - 谢谢。
在我看来,您对与用户输入的范围重叠的所有行都感兴趣。
可以有三种类型的重叠:
LV_FROM
在用户开始日期和用户结束日期之间。LV_TO
在用户开始日期和用户结束日期之间。LV_FROM
在用户开始日期之前,LV_TO
在用户结束日期之后。
所以,让我们将这些转化为三个条件:
SELECT * FROM VW_LEAVEDETAILS m WHERE M.EMPNO = '123456'
AND (
(M.LV_FROM between '17-OCT-2018' AND '18-OCT-2018')
or (M.LV_TO between '17-OCT-2018' AND '18-OCT-2018')
or (M.LV_FROM < '17-OCT-2018' AND M.LV_TO > '18-OCT-2018')
);
如果您能提供更多信息和示例数据,可以帮助我们提供更好的答案。
如果你想要重叠,那么逻辑是:
SELECT m.*
FROM VW_LEAVEDETAILS m
WHERE M.EMPNO = '123456' AND
M.LV_TO >= DATE '2018-10-17' AND
M.LV_FROM <= DATE '2018-10-18';
如果一个在第二个结束之前开始,而第一个在第二个开始之后结束,则两个时间段重叠(结束点可能包括也可能不包括,具体取决于您的重叠逻辑)。