我们有一个 MySQL 数据库,其中包含不同球场的预订情况。表属性(缩短):
CREATE TABLE `booking` (
`startDate` datetime NOT NULL,
`endDate` datetime NOT NULL,
`courtId` varchar(36),
FOREIGN KEY (`courtId`) REFERENCES `court` (`id`) ON DELETE CASCADE
)
通常情况下,预订是付费的,但在某些条件下(我可以在查询的 WHERE
部分中查看),预订可以是免费的。
鉴于法庭和预订持续时间,我想查询可以免费创建预订的下一个日期时间。条件不是问题,问题是如何查询 datetime
值而不是实体。
如何在MySQL中高效地实现这一点?
编辑:也许它有助于概述免费预订的条件:
免费预订的条件取决于某人在 startDate
提供了多少个球场(总是提供球场,除非该球场有特殊的“未提供”预订)以及如何提供许多与 startDate
重叠的其他预订已经免费。这意味着即使数据库中根本没有预订,预订也可以(并且可能是)免费。
最佳答案
解决方案
查找上次预订之前的可用时段
:
找出每个预订与下一个预订之间的差异。如果差额大于新预订的天数,您可以使用该时段。
查找上次预订后的可用时段
:
如果没有这样的时段,您可以指定上次预订结束日期后的一天。
如果该查询返回null,则表示没有法庭预订。您可以在客户端处理该问题。
代码
SET @c := 1; # Court id
SET @n := 2; # Number of days
/*
Previous booking
*/
SET @i := 0;
CREATE TEMPORARY TABLE bp AS
SELECT @i := @i + 1 AS id, startDate, endDate FROM booking
WHERE courtId = @c
ORDER BY startDate;
/*
Next booking
*/
SET @i := -1;
CREATE TEMPORARY TABLE bn AS
SELECT @i := @i + 1 AS id, startDate, endDate FROM booking
WHERE courtId = @c
ORDER BY startDate;
/*
Finding available slot before the last booking (Intermediate slot).
*/
SELECT DATE_ADD(MIN(bp.endDate), INTERVAL 1 DAY) INTO @si FROM
bp
JOIN
bn
ON bn.id = bp.id
WHERE DATEDIFF(bn.startDate, bp.endDate) > @n;
/*
Finding available slot after the last booking
*/
SELECT DATE_ADD(MAX(endDate), INTERVAL 1 DAY) INTO @sa FROM bn;
SELECT IFNULL(@si, @sa);
使用代码
只需替换变量@c
和@n
的值即可。
关于mysql - 如何在 MySQL 中查找满足某些条件的日期时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58526506/