首页 > 解决方案 > 如何在 MySQL 中找到某些条件成立的日期时间?

问题描述

我们有一个 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已经是免费的。这意味着即使数据库中根本没有预订,预订也可以(并且可能)免费。

标签: mysqldatetime

解决方案


解决方案

Finding available slot before the last booking
查找每个预订与其下一个预订之间的差异。如果差值大于新预订的天数,您可以使用该时段。

Finding available slot after the last booking
如果没有这样的时段,您可以指定最后一次预订结束日期后的一天。

如果此查询返回 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.


推荐阅读