mysql - 如何获得不在两个日期之间的结果?

标签 mysql laravel-5 between

我有两个日期表示属性(property)在这两天被封锁,例如开始日期 2017-01-20 和结束日期 2017-01-25。在这两个日期之间,属性(property)已被封锁。当我搜索除这两个日期之外的这两个日期时,我想获取剩余的日期。

这里我试过在 MySQL 中搜索网络

select `pd`.*, `pa`.*
from `property_details` as `pd` left join
     `property_gallery` as `pg`
     on `pg`.`property_id` = `pd`.`property_id` left join
     `property_preblock_details` as `pbd`
     on `pbd`.`property_id` = `pd`.`property_id` left join
     `property_amenity` as `pa`
     on `pa`.`property_id` = `pd`.`property_id`
 where `pbd`.`start_date` >= '2017-01-20'  and `pbd`.`end_date` <= '2017-01-25'

select pd.* from 
    `property_details` as `pd` left join 
    `property_gallery` as `pg` on `pg`.`property_id` = `pd`.`property_id` 
    left join `property_preblock_details` as `pbd` 
    on `pbd`.`property_id` = `pd`.`property_id` 
    left join `property_amenity` as `pa`
    on `pa`.`property_id` = `pd`.`property_id` 
 where `pbd`.`start_date` NOT BETWEEN CAST('2017-01-20' AS DATE) and CAST('2017-01-25' AS DATE) 
 AND `pbd`.`end_date` NOT BETWEEN CAST('2017-01-20' AS DATE) and CAST('2017-01-25' AS DATE)

但我得到的是两个日期之间的结果。

我不想获得日期之间的结果,我不想获得日期之间的结果。

Property_rate

id    start_date    end_date     prop_id
1     2017-01-20    2017-01-25     1
2     2017-01-26    2017-01-27     1
3     2017-01-26    2017-01-28     2

属性(property)

prop_id  prop_name
1        test1
2        test2

如果我选择 2017-01-20 和 2017-01-25,我只想获取“test2”属性详细信息。不是“test1”的详细信息。

最佳答案

你已经很接近了。您的查询是这样说的:

    where `pbd`.`start_date` >= '2017-01-20'   /* close, but wrong */
      and `pbd`.`end_date` <= '2017-01-25'

你要的是这个:

    where (    `pbd`.`start_date` < '2017-01-20'  
           or  `pbd`.`end_date`  > '2017-01-25')

也可以这样写

    where not (      `pbd`.`start_date` >= '2017-01-20' 
                 and `pbd`.`end_date` <= '2017-01-25')

注意 您的查询可能有其他错误。如果你的start_dateend_date列有 DATE数据类型,一切就绪。但是如果他们有另一种数据类型,比如DATETIMETIMESTAMP ,您的查询还有另一个问题。要在 20-Jan-2017 -- 25-Jan-2017 这几天捕获所有具有日期/时间值的行,您需要这个

where `pbd`.`start_date` >= '2017-01-20'   /*dates IN range */
  and `pbd`.`end_date` < '2017-01-26'

请注意,我将所需的结束日期推迟了一天并使用了 <而不是 <= .这适用于

          2017-01-25 23:59     should be in range
          2017-01-26 00:00     should be out of range
          2017-01-26 00:01     should be out of range

关于mysql - 如何获得不在两个日期之间的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41740994/

相关文章:

mysql - mysql5删除一个数据库的所有程序的方法

sql - 在 ORDER BY 子句中使用 2 个字段

php - 我的 Laravel 5.2.10 session 不会持续

mysql - 从到达和离开日期选择未预订的房间

mysql - 降低Mysql查询CPU利用率

php - MySQL workbench 连接数据库的方法

php - Laravel 4/5 搜索表单,如

mysql - SELECT 列表的表达式不在 GROUP BY 子句中并且包含非聚合列

MYSQL 查询不返回 BETWEEN 的结果,但在子查询中返回小于和等于的结果

MySQL 连接同一行不同列的两个表