我需要检查我的数据库中是否有两个日期和另外两个日期。
我的数据库看起来像这样
+----+--------------+------------+------------+
| id | code | StartDate | EndDate |
+----+--------------+------------+------------+
| 1 | KUVX-21-40 | 2013-10-23 | 2013-11-22 |
| 2 | UEXA286-1273 | 2013-10-30 | 2013-11-29 |
| 3 | UAJFAU-2817 | 2013-10-21 | 2013-11-20 |
| 4 | KUVX-21-40 | 2013-10-30 | 2013-11-29 |
+----+--------------+------------+------------+
在我的查询中,我指定范围:开始日期和结束日期 让它们如下所示:
ScopeStartDate = "2013-10-1"
ScopeEndDate = "2013-11-26"
上面应该返回所有记录,因为所有记录都是重叠的。
但是我无法查询工作:/
我已经尝试了以下查询而没有运气:
WHERE
(
(StartDate < ScopeStartDate AND StartDate > ScopeStartDate)
OR
(StartDate > ScopeStartDate AND EndDate < ScopeEndDate )
)
这给我两个结果: 1和3
我做错了什么?
答案 0 :(得分:29)
我认为以下条件符合每个可能的重叠案例。
WHERE
(
(ScopeStartDate <= EndDate AND ScopeEndDate >= StartDate)
)
除非您声明了不合逻辑的时间跨度(例如,那些在开始之前结束的时间)
答案 1 :(得分:1)
这只是where子句。给定InputStartDate和InputEndDate由用户输入给出,DataStartDate和DataEndDate是表中的日期时间值:
where((DataEndDate&gt; InputStartDate)和(DataStartDate&lt; InputEndDate))
答案 2 :(得分:1)
这是一个旧线程,但使用BETWEEN。这是从我的时间点开始的,请修改你的需求......
$qs = "SELECT COUNT(*) AS `count` FROM `timeclock` WHERE `userid` = :userid
AND (
(`timein` BETWEEN :timein AND :timeout OR `timeout` BETWEEN :timein AND :timeout )
OR
(:timein BETWEEN `timein` AND `timeout` OR :timeout BETWEEN `timein` AND `timeout`)
);";
答案 3 :(得分:0)
即使数据库中的toDate
可能为null,您也可以覆盖所有日期重叠的情况,如下所示:
SELECT * FROM `tableName` t
WHERE t.`startDate` <= $toDate
AND (t.`endDate` IS NULL OR t.`endDate` >= $startDate);
这将始终返回与新的开始/结束日期重叠的所有记录。