我需要一些帮助来查询我的日历/日期表
场景: 我有一个带有日期的“日历”表,用户将设置他的可用日期,通常是一天一天。所以我的表看起来像这样:
+------+------------+---------------------+---------------------+
| ID | user_id | start_date | end_date |
+------+------------+---------------------+---------------------+
| 1 | 1 | 2016-09-01 08:00:00 | 2016-09-01 16:00:00 |
| 2 | 1 | 2016-09-03 08:00:00 | 2016-09-03 16:00:00 |
| 3 | 1 | 2016-09-04 08:00:00 | 2016-09-04 16:00:00 |
| 3 | 1 | 2016-09-05 08:00:00 | 2016-09-05 16:00:00 |
+------+------------+---------------------+---------------------+
这意味着用户 1 在 1 号、3 号、4 号和 5 号有空。
假设我想查询表并查找从日期 2016-09-01 08:00:00 到 2016-09-05 16:00:00 用户是否可用,此查询必须返回零行,因为用户9 月 2 日不可用。但是如果从日期 2016-09-03 08:00:00 到 2016-09-05 16:00: 00 查询,那么它将返回这 3 行。
希望有人能帮我解决这个问题
最佳答案
这可能是一种方式(对于单个用户)。
注意 @endDate
和 @startDate
是提供的要搜索的日期字段。
SELECT
*
FROM your_table
WHERE EXISTS (
SELECT
user_id
FROM your_table
WHERE start_date >= @startDate
AND start_date <= @endDate
AND user_id = 1
GROUP BY user_id
HAVING SUM((DATEDIFF(end_date,start_date)+1)) = DATEDIFF(@endDate,@startDate)+1
)
AND start_date >= @startDate
AND start_date <= @endDate
AND user_id = 1
注意:
如果提供的日期范围落在 start_date
和 end_date
(不包括)范围内,则它将不起作用。
因为 SUM((DATEDIFF(end_date,start_date)+1)) = DATEDIFF(@endDate,@startDate)+1
在这种情况下不相等。 条件
在这种情况下,您需要保持在要求的范围内。这里的边界由 end_date
和 @endDate
的较小值以及 start_date
和 @startDate
的较大值划分>.
假设,你有如下记录(只有一条)
start_date = 2016-09-01
和 end_date=2016-09-05
。
和@startDate=2016-09-02
,@endDate=2016-09-04
现在检查上述条件对于这组数据是否会失败。
在这种情况下,您需要采用以下查询:
SELECT
*
FROM your_table
WHERE EXISTS (
SELECT
user_id
FROM your_table
WHERE end_date >= @startDate
AND start_date <= @endDate
AND user_id = 1
GROUP BY user_id
HAVING SUM((DATEDIFF(LEAST(end_date,@endDate),GREATEST(start_date,@startDate))+1)) = DATEDIFF(@endDate,@startDate)+1
)
AND end_date >= @startDate
AND start_date <= @endDate
AND user_id = 1
关于mysql - SQL/Mysql查询数据库中可用日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39546091/