sql >> データベース >  >> RDS >> Mysql

予約カレンダーの到着日と出発日

    次のことを考慮してください...

    DROP TABLE IF EXISTS my_table;
    
    CREATE TABLE my_table
    (book_id  INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    ,arrive_date DATE NOT NULL
    ,depart_date DATE NOT NULL
    );
    
    INSERT INTO my_table VALUES
    (1,'2015-07-20','2015-07-22'),
    (2,'2015-07-22','2015-07-23'),
    (3,'2015-07-19','2015-07-20');
    
    SELECT * FROM my_table;
    +---------+-------------+-------------+
    | book_id | arrive_date | depart_date |
    +---------+-------------+-------------+
    |       1 | 2015-07-20  | 2015-07-22  |
    |       2 | 2015-07-22  | 2015-07-23  |
    |       3 | 2015-07-19  | 2015-07-20  |
    +---------+-------------+-------------+
    

    したがって、SELECTは次のようになります...

    SELECT '2015-07-22','2015-07-24' 
      FROM (SELECT 1) x 
      LEFT 
      JOIN my_table y
        ON y.arrive_date < '2015-07-24' AND y.depart_date > '2015-07-22'
     WHERE y.book_id IS NULL 
     LIMIT 1;
    Empty set (0.00 sec)
    
    SELECT '2015-07-23','2015-07-24' 
      FROM (SELECT 1) x 
      LEFT 
      JOIN my_table y
        ON y.arrive_date < '2015-07-24' AND y.depart_date > '2015-07-23'
     WHERE y.book_id IS NULL 
     LIMIT 1;
    +------------+------------+
    | 2015-07-23 | 2015-07-24 |
    +------------+------------+
    | 2015-07-23 | 2015-07-24 |
    +------------+------------+
    

    ...しかし、最初にそれらをチェックする必要はありません。チェックがINSERTの一部として発生するように、意図的にSELECTを記述しました...

    INSERT INTO my_table (arrive_date,depart_date)
    SELECT '2015-07-23','2015-07-24' 
      FROM (SELECT 1) x 
      LEFT 
      JOIN my_table y
        ON y.arrive_date < '2015-07-24' AND y.depart_date > '2015-07-23'
     WHERE y.book_id IS NULL 
     LIMIT 1;
    
    SELECT * FROM my_table;
    +---------+-------------+-------------+
    | book_id | arrive_date | depart_date |
    +---------+-------------+-------------+
    |       1 | 2015-07-20  | 2015-07-22  |
    |       2 | 2015-07-22  | 2015-07-23  |
    |       3 | 2015-07-19  | 2015-07-20  |
    |       4 | 2015-07-23  | 2015-07-24  |
    +---------+-------------+-------------+
    

    実際には、提供したいユーザーエクスペリエンスに応じて、最初にSELECTを実行して、ユーザーが利用できない日付をすぐに確認してから、予約時にINSERTを実行することをお勧めします-ユーザーが予約の途中でこれらの日付を取得しないようにするため。



    1. mysql:テーブルBに存在しない場合は、テーブルAからすべてのアイテムを選択します

    2. Oracleで大文字を含む行を見つける4つの方法

    3. データベースのAzureSQLデータベースへの移行

    4. Dockerを使用すると、次のエラーが発生します:SQLSTATE[HY000][2002]そのようなファイルまたはディレクトリはありません