我真的很卡住。 我有一个数据库表,其中列出了已预订时间段的属性。 我需要在表格中搜索日期范围。 我当前查询的问题在于,如果表中列出的日期超出查询日期范围,则查询不会返回正确的结果。 下面是表的示例propty_availability
id BeginDate EndDate propid
1 2018-10-02 2018-10-10 155855
2 2018-12-15 2018-12-22 159170
3 2018-12-22 2018-12-25 155855
4 2018-12-26 2018-12-29 155855
5 2018-12-05 2018-12-15 155019
6 2018-11-20 2018-11-27 155855
7 2018-12-18 2018-11-27 155655
我的查询是:
从propty_availability中选择属性 哪里 (开始日期在"2018-12-20"和"2018-12-27"之间( 和 (结束日期在"2018-12-20"和"2018-12-27"之间(
问题是此查询将仅返回记录 3 和 6,因为预订的日期范围包括查询的完整日期范围。 我在开始日期和结束日期之间尝试了 OR 而不是 AND,但这给了我包含开始日期或结束日期的记录。 表中具有查询日期之外的列之一的任何内容都不会列出。
如何让查询向我显示介于查询日期之间并与表中的日期相对应的任何内容的行? 预期结果是列出第 2、3、4、6、7 行,因为每行的日期都在查询的范围内。 请随时提问,因为我不熟悉如何在此处发布代码和表格。
在这里用蛮力...
SELECT propid FROM propty_availability
WHERE
(BeginDate BETWEEN '2018-12-20' AND '2018-12-27' OR BeginDate < '2018-12-20')
AND
(EndDate BETWEEN '2018-12-20' AND '2018-12-27' OR EndDate > '2018-12-20')
因此,可能的情况是:
- 您的查询在月经之前开始,但在月经期间结束
- 它整齐地在里面
- 在期间开始,但在之后结束
- 完全重叠
- 它完全在外侧
一点图形辅助:
|---------------------| # Period
+-----+ +-----+ +-----------+ # 1, 2, 3
+---------------------------+ # 4
+-----+ +-------+ # 5 (x2)
1: (false OR true) AND (true OR true) = true
2: (true OR false) AND (true OR true) = true
3: (true OR false) AND (false OR true) = true
4: (false OR true) AND (false or true) = true
5: (false OR true) AND (false OR false) = false
5(2): (false o false) AND (false OR false) = false
逻辑测试(以 php 为单位(
is_range_in_range(1, '2018-12-17', '2018-12-22');
is_range_in_range(2, '2018-12-22', '2018-12-25');
is_range_in_range(3, '2018-12-23', '2018-12-30');
is_range_in_range(4, '2018-12-17', '2018-12-30');
is_range_in_range(5, '2018-12-01', '2018-12-15');
is_range_in_range(5, '2018-12-29', '2018-12-31');
is_range_in_range(6, '2018-11-18', '2018-11-27');
function is_range_in_range($c, $b, $e) {
$bDate = DateTime::createFromFormat('Y-m-d', '2018-12-20');
$eDate = DateTime::createFromFormat('Y-m-d', '2018-12-27');
$b = DateTime::createFromFormat('Y-m-d', $e);
$e = DateTime::createFromFormat('Y-m-d', $e);
echo $c . " " . ((($b >= $bDate && $b <= $eDate) || ($b < $bDate))
&& (($e >= $bDate && $e <= $eDate) || ($e > $bDate)) ? 'true' : 'false') . "n";
}
请注意,endDate > beginDatePeriod
不是错别字。
输出:
1 true
2 true
3 true
4 true
5 false
5 false
6 false