使用查询查找范围内的日期

时间:2018-10-28 09:47:53

标签: sql oracle oracle10g

我正在尝试使用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

请参见上述 2018年10月22日已为数据库表日期范围分配,并且每当尝试再次分配该日期范围时,都应抛出错误或至少拉范围。我正在尝试像这样的愚蠢的事情,相反的却卡住了:

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';

NB:基本上是用于请假管理系统的。因此,只要在该范围内分配了日期,就应该进行验证。以下是三个条件:

LV_FROM在用户开始和结束日期之间
LV_TO在用户开始和结束日期之间
LV_FROM在用户开始日期之前,而LV_TO在用户结束日期之后

信贷请@Corion提出编辑建议-谢谢。

2 个答案:

答案 0 :(得分:2)

在我看来,您对与用户输入范围重叠的所有行都感兴趣。

可以有三种重叠类型:

  1. LV_FROM在用户开始和结束日期之间。
  2. LV_TO在用户开始和结束日期之间。
  3. 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')
);

如果您可以提供更多信息和示例数据,则可以帮助我们提供更好的答案。

答案 1 :(得分:2)

如果要重叠,则逻辑为:

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';

如果一个句点在第二个端点之前开始,而第一个端点在第二个端点之后开始,则两个句段重叠(取决于您的重叠逻辑,可能包括也可以不包括端点)。