在日期范围内搜索

时间:2018-09-28 23:48:04

标签: php mysql date

我真的很困。我有一个数据库表,其中列出了已预订时隙的属性。我需要在表格中搜索日期范围。我当前查询的问题是,如果表中列出的日期不在查询的日期范围内,则查询不会返回正确的结果。 这是表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

我的查询是:
    

SELECT propid FROM propty_availability
            WHERE 
                (BeginDate BETWEEN '2018-12-20' AND '2018-12-27') 
                        AND 
                (EndDate BETWEEN '2018-12-20' AND '2018-12-27')

问题在于,此查询将仅由于预订的日期范围包括查询的完整日期范围而返回记录3和6。 我在开始日期和结束日期之间尝试使用OR而不是AND,但这给了我包含开始日期或结束日期的记录。表格中包含查询日期以外的列之一的任何内容都不会列出。

如何获取查询以向我显示在查询日期之间并且与表中的日期相对应的所有行? 预期结果是要列出第2、3、4、6、7行,因为每个行的日期都在查询的范围内。 随意提问,因为我不熟悉如何在此处发布代码和表格。

1 个答案:

答案 0 :(得分:-1)

在这里蛮横地去...

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

因此,可能的情况是:

  1. 您的查询开始于您的月经之前,但在此期间结束
  2. 里面整齐
  3. 在此期间开始,但在此之后结束
  4. 完全重叠
  5. 完全淘汰

一些图形帮助:

                 |---------------------|            # 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