我需要帮助来创建查询以在所选时间段内已有 session 时返回。
我有表 rep_reuniao
具有以下设计
ID --> int
ROOM --> int
DATE_BEGIN --> DATETIME
DATE_END --> DATETIME
现在在表 rep_reuniao
中插入一行看起来像这样
ID --> 1
ROOM --> 2
DATE_BEGIN --> 2014-02-21 17:00:00
DATE_END --> 2014-02-21 18:00:00
我将创建一个 Jquery Ajax 脚本来返回 true
或 false
基于所选日期时间的 JSON 响应。
所以查询将有 ROOM
, DATE_BEGIN
采用这种格式 2014-02-21 17:00
和 DATE_END
同样的格式 2014-02-21 18:00
我检查了其他回复,但其中大部分是显示可用房间的查询。在我的设计中,一个房间总是可用的,除非在 table 上有一个寄存器。
Example 1
房间 1
已从 2014-02-21 17:00:00
开始使用至 2014-02-21 18:00:00
如果用户在以下位置选择房间,则需要创建一个查询以返回一个值(任何值):
BEGIN = 2012-02-21 16:30:00
END = 2012-02-21 17:30:00
看到了吗?表中使用的房间从 17:00 开始,所以如果用户选择的开始时间相同,今天我的查询很容易返回一个值。但是用户选择的结束日期在已经使用的时间之间。
嗯,查看开始日期和结束日期,用户选择的时间无法使用。我现在没有想法,任何人都可以帮助我吗?
您需要检查一个日期范围是否与另一个日期范围重叠。
New Date Range = |-----------|
Test1 = |=====|
Test2 = |=====|
Test3 = |=====|
Test4 = |=====|
Test5 = |=====|
Test6 = |=================|
只有 Test1 和 Test5 不重叠。
抱歉,如果有任何英文错误。如果有人能够修复,我将不胜感激。
最佳答案
关于重叠时间范围的正确逻辑是,当这两个条件都为真时,两个时间范围重叠:
- 第一个在其他结束之前开始
- 一个开始后一个结束
在SQL中,这些很容易表达:
SELECT r.*
FROM rep_reuniao r
WHERE @UserBegin <= r.DATE_END AND
@UserEnd >= r.DATE_BEGIN;
请注意,当在指定时间范围内举行多个 session 时,这可能会返回多行。
如果您想要 true/false 或 0/1,则使用聚合和 case
:
SELECT (case when count(*) = 0 then 'false' else 'true' end) as HasOverlappingRooms
FROM rep_reuniao r
WHERE @UserBegin <= r.DATE_END AND
@UserEnd >= r.DATE_BEGIN;
关于mysql - SQL - 查询 session 室,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21977126/