mysql - 如何在 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
已经是免费的。这意味着即使数据库中根本没有预订,预订也可以(并且可能)免费。
解决方案
解决方案
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
.
推荐阅读
- php - Laravel updateOrCreate 与 hasMany 关系
- python - python tkinter 你的 SQL 语法有错误
- python - 无法使用 conda 部署到 heroku,requirements.txt 失败
- batch-file - 使用 Edge 从批处理文件全屏启动 Powerapp
- css - 如何在 laravel 8 中安装引导程序
- python - 通过 lambda 函数读取 AWS S3 存储桶中的 .tif 文件,这些文件包含在另一个目录中
- php - 我可以在 php mysqli_prepare 中使用 IF NOT EXISTS SELECT 吗?
- stm32 - Nucleo-H743ZI2 板的问题
- ios - 即使在 Swift iOS 中缩小,如何在 mapView 中显示所有地图图钉
- spring - 禁用 Spring Boot/Cloud 中的功能