代码之家  ›  专栏  ›  技术社区  ›  Ankit

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

  •  -1
  • Ankit  · 技术社区  · 6 年前

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

    在那张表中,我保存了所有的拍摄日期。它可以是随机的。所以我需要下一个尚未保存在此表中的日期。

    理论上,我在想,如果我能从该表中得到每两个后续日期之间的差异,那就应该给我一个线索,说明哪些日期范围是空的。不太确定该如何编码。

    我不想在这里使用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 回复  |  直到 6 年前
        1
  •  3
  •   Strawberry    6 年前

    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 |
    +------------+
    
        2
  •  1
  •   Sloan Thrasher    6 年前

    SQL Fiddle

    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');
    

    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 |