mysql - 如何在 MySQL 中查找满足某些条件的日期时间?

标签 mysql datetime

我们有一个 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/

相关文章:

php - MySQL 多重排序(嵌套)

php - MySQL 算法与查询

mysql - 我应该如何从英特尔 XDK Web 应用程序向 MySQL 发出请求?

MySQL选择不在特定日期和时间的id

python - 如何从时间格式 %Y-%m-%dT%H 中删除 T :%M:%S?

php - Mysql在插入的值数组中插入了id

ruby-on-rails-3 - 将列类型从字符变化更改为不带时区的时间戳

php - 在 PHP 中格式化 MySQL 日期时间

arrays - 如何使用 Vue.js 2 按日期对数组进行排序

java - 防止Java程序中的SQL注入(inject)攻击