Php 根据日期范围之间的日期列获取之间的可用用户
我有两张桌子:Php 根据日期范围之间的日期列获取之间的可用用户,php,mysql,Php,Mysql,我有两张桌子: 1) Users 2) Calendars 每个用户都有自己的日历。他们可以选择一系列日期并将其标记为: => Available (1) => UnAvailable (2) 现在,calendars表最初将为空,这意味着所有用户每天都可以使用。现在我想要在给定日期范围内可用的所有用户。例如:我的数据库现在如下所示: 1) 使用者 2) 日历 ------------------------------------------------------------
1) Users
2) Calendars
每个用户都有自己的日历。他们可以选择一系列日期并将其标记为:
=> Available (1)
=> UnAvailable (2)
现在,calendars表最初将为空,这意味着所有用户每天都可以使用。现在我想要在给定日期范围内可用的所有用户。例如:我的数据库现在如下所示:
1) 使用者
2) 日历
------------------------------------------------------------------------
id user_id start_date end_date type
------------------------------------------------------------------------
1 2 2016-02-20 2016-02-25 2
2 2 2016-02-20 2016-02-25 1
3 2 2016-02-22 2016-02-24 2
现在,如果我搜索日期为2016-02-20至2016-02-25之间的用户,我应该得到用户1和3,因为2在2016-02-22至2016-02-24期间不可用
此外,如果我在2016-02-20至2016-02-22或2016-02-24至2016-02-26之间搜索,则我还应获得用户1和3
到目前为止,我已经尝试过这个代码,但这个似乎不起作用
$query = "
SELECT users.id FROM users
WHERE id NOT IN
(
SELECT user_id FROM calendars
WHERE ( '2016-02-20' >= `start_date` AND '2016-02-25' <= `end_date`)
OR ( '2016-02-20' <= `start_date` AND '2016-02-25' >= `end_date`)
OR ( `start_date` BETWEEN '2016-02-20' AND '2016-02-25')
OR ( `end_date` BETWEEN '2016-02-20' AND '2016-02-25')
AND type = 2
)
";
$users = \DB::select( \DB::raw($query) );
$availableusers = [];
foreach ($users as $user) {
$availableusers[] = $user->id;
}
return $availableusers;
在这里,在“2016-02-21”和“2016-02-23”之间搜索,我应该在可用列表中获得用户2
SELECT * FROM Users s
WHERE NOT EXISTS(select 1 from Calender t
where t.user_id = s.id and t.type = 2
and ((t.start_date between YourStartRange and YourEndRange)
OR(t.end_date between YourStartRange and YourEndRange)
OR(YourStartRange between t.start_date and t.end_date)))
这需要所有的可能性:
- 给定的范围在范围之前开始,在范围之间结束
- 给定的范围从它们之间开始,在它们之后结束
- 给定的范围介于两者之间
1) Users
-----------------
id name
-----------------
1 abc
2 lmn
3 xyz
2) Calendars
------------------------------------------------------------------------
id user_id start_date end_date type
------------------------------------------------------------------------
1 2 2016-02-21 2016-02-25 2
2 2 2016-02-21 2016-02-25 1
3 3 2016-02-23 2016-02-24 2
SELECT * FROM Users s
WHERE NOT EXISTS(select 1 from Calender t
where t.user_id = s.id and t.type = 2
and ((t.start_date between YourStartRange and YourEndRange)
OR(t.end_date between YourStartRange and YourEndRange)
OR(YourStartRange between t.start_date and t.end_date)))