获取下一个可用日期(第一个不存在的日期在mysql Taked_dates表中)

时间:2018-07-09 15:34:42

标签: mysql

我想创建一个查询以获取表中不存在的下一个日期(今天之后)。

在该表中,我保存了所有获取的日期。它可以是随机的。因此,我需要下一个尚未保存在该表中的日期。

从理论上讲,我在想是否可以从该表中获得每隔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作为查询的输出。

2 个答案:

答案 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)

这将返回一个空缺列表以及每个中的第一个开放日期。

SQL Fiddle

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 |