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

Posted

技术标签:

【中文标题】使用查询查找范围内的日期【英文标题】:Find Dates in Range Using Query 【发布时间】:2018-10-28 09:47:53 【问题描述】:

我正在尝试使用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 已为 数据库表 日期范围分配,每当尝试再次分配时,应该抛出错误或至少拉高范围。我正在尝试像这样愚蠢的事情,相反的但卡住了:

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

注意:基本上是用于休假管理系统的。因此,只要在该范围内分配了一个日期,它就应该验证。以下三种情况:

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

感谢@Corion 提供编辑建议 - 谢谢。

【问题讨论】:

请添加更多示例,并解释为什么示例数据应包含在结果中或排除在外。 基本上是用于休假管理系统的。因此,只要在该范围内分配了一个日期,它就应该验证@Corion。 我们不知道您对“休假管理系统”的需求是什么。请花一些精力描述实际的业务规则。 【参考方案1】:

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

可以有三种类型的重叠:

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

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

【讨论】:

太完美了。我正在编辑我的帖子并使用这些规则 - 几乎相同。谢谢@Corion。【参考方案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';

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

【讨论】:

以上是关于使用查询查找范围内的日期的主要内容,如果未能解决你的问题,请参考以下文章

从 Vava 到 MongoDB 查询:查找特定日期范围内的事件

SQL 如何查询日期在一定范围内的数据

Laravel Eloquent 在 JSON 列中查找日期在某个范围内的所有记录

在multiValued字段中搜索日期范围内的日期

查找给定日期范围内的工作日/周末数

使用 Oracle 查找任意日期范围内的行数