我想创建一个查询以获取表中不存在的下一个日期(今天之后)。
在该表中,我保存了所有获取的日期。它可以是随机的。因此,我需要下一个尚未保存在该表中的日期。
从理论上讲,我在想是否可以从该表中获得每隔2个后续日期之间的差额,从而可以为我提供一个提示,指出哪些日期可以使用空白范围。不太确定如何将其编码。
我在这里避免使用PHP,而是想在MySQL中完成所有操作
Table(booked_dates)
user_id (int)
booked_date (date)
so if this table say contains entries like below.
2, 2018-07-08,
2, 2018-07-09
2, 2018-07-10
2, 2018-07-11
2, 2018-07-12
2, 2018-07-15
2, 2018-07-17
然后我在'2018-07-09'
上运行上述查询,然后期望得到2017-07-13
作为查询的输出。
答案 0 :(得分:3)
例如:
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(booked_date date NOT NULL PRIMARY KEY
);
INSERT INTO my_table VALUES
('2018-07-08'),
('2018-07-09'),
('2018-07-10'),
('2018-07-11'),
('2018-07-12'),
('2018-07-15'),
('2018-07-17');
SELECT MIN(x.booked_date + INTERVAL 1 DAY) dt
FROM my_table x
LEFT
JOIN my_table y
ON y.booked_date - INTERVAL 1 DAY = x.booked_date
WHERE y.booked_date IS NULL;
+------------+
| dt |
+------------+
| 2018-07-13 |
+------------+
答案 1 :(得分:1)
这将返回一个空缺列表以及每个中的第一个开放日期。
MySQL 5.6模式设置:
DROP TABLE IF EXISTS `booked_dates`;
CREATE TABLE IF NOT EXISTS `booked_dates` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Primary Key',
`user_id` INT(11) UNSIGNED NULL DEFAULT NULL COMMENT 'User ID - FK to users',
`booked_date` DATE NULL DEFAULT '0000-00-00' COMMENT 'Date Booked',
PRIMARY KEY (`id`),
KEY `idx_booked_date` (`booked_date`),
KEY `idx_user_id` (`user_id`)
)
ENGINE=MyISAM
AUTO_INCREMENT=1
DEFAULT CHARSET=utf8
COLLATE=utf8_unicode_ci
COMMENT '';
INSERT INTO `booked_dates`
(`user_id`,`booked_date`)
VALUES
(2, '2018-07-08'),
(2, '2018-07-09'),
(2, '2018-07-10'),
(2, '2018-07-11'),
(2, '2018-07-12'),
(2, '2018-07-15'),
(2, '2018-07-17');
查询1 :
SELECT
a.`booked_date`,
a.`booked_date` as `d1`,
b.`booked_date` as `d2`,
DATE_ADD(a.`booked_date`,INTERVAL 1 DAY) as `First Available`,
DATEDIFF(b.`booked_date`,a.`booked_date`) as `date diff`
FROM `booked_dates` a
JOIN `booked_dates` b
ON a.`booked_date` < b.`booked_date`
GROUP BY a.`booked_date`
HAVING `date diff` > 1
Results :
| booked_date | d1 | d2 | First Available | date diff |
|-------------|------------|------------|-----------------|-----------|
| 2018-07-12 | 2018-07-12 | 2018-07-15 | 2018-07-13 | 3 |
| 2018-07-15 | 2018-07-15 | 2018-07-17 | 2018-07-16 | 2 |