Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/236.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 根据日期范围之间的日期列获取之间的可用用户_Php_Mysql - Fatal编程技术网

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)))
这需要所有的可能性:

  • 给定的范围在范围之前开始,在范围之间结束
  • 给定的范围从它们之间开始,在它们之后结束
  • 给定的范围介于两者之间

到目前为止您尝试了什么?显示代码重叠的测试更简单。如果事件A在事件B结束之前开始,而事件A在事件B开始之后结束,那么可以说事件A与事件B重叠-记住要测试'type'@Pranab现在试试,我忘了添加类型筛选器out@sagi我已将更新添加到我的查询中,请查看look@Pranab正如我所说的,再试一次,告诉我它是否仍然不起作用(我已经更新了答案)@sagi用户2仍然不在可用列表中
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)))