gpt4 book ai didi

php - 根据日期范围之间的日期列获取可用用户

转载 作者:行者123 更新时间:2023-11-29 02:51:13 24 4
gpt4 key购买 nike

我有两个表:

1) Users
2) Calendars

每个用户都有自己的日历。他们可以选择一系列日期并将其标记为:

=> Available (1)
=> UnAvailable (2)

现在,日历表最初是空的,这意味着所有用户每天都有空。现在我想要在给定日期范围内可用的所有用户。例如:我的数据库现在看起来像这样:

1) 用户

-----------------
id name
-----------------
1 abc
2 lmn
3 xyz

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;

请帮帮我。

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

在这里搜索 '2016-02-21' 和 '2016-02-23' 我应该在 availbale lisy 中找到用户 2

最佳答案

您可以为此使用 NOT EXISTS():

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

这需要所有的可能性:

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

关于php - 根据日期范围之间的日期列获取可用用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35479679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com