복붙노트

[SQL] 달력 도착 및 출발 날짜 예약

SQL

달력 도착 및 출발 날짜 예약

이것은 일반적인 질문을 보일지도 모르지만, 나는이 문제에 대한 답을 찾을 수 없습니다.

나는 예약 테이블이 있습니다 :

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  

당신은 내가 출발 날짜는이 반대의 날짜와 그 도착 될 수 있음을 입증 것을 볼 수 있습니다

날짜가 추가되기 전에 나는 날짜 범위, 출발 날짜가 난에서 날짜를 확인할 때이 가능하도록, 사람이 떠날 것 같은 날짜에 도착 될 수 있도록하는 것이 중요 테이블에 날짜와 충돌하지 인 것을 확인 테이블이 나는 arrive_date에 날짜를 추가하고이 SQL을 사용하여 depart_date에서 하루 빼기 :

Select * From booking Where booking.unit_id = 58 
  And ( DATE_ADD(booking.from_date, INTERVAL 1 DAY) 
  BETWEEN '2015-07-23' AND '2015-07-24' 
   OR 
  DATE_SUB(booking.to_date, INTERVAL 1 DAY) 
   BETWEEN '2015-07-23' AND '2015-07-24' 
      OR '2015-07-23' 
   BETWEEN DATE_ADD(booking.from_date, INTERVAL 1 DAY) 
   AND DATE_SUB(booking.to_date, INTERVAL 1 DAY)) Limit 1  

I는 두 번째와 세 번째와 같은 제 날짜, 아무런 문제를 추가 할 때 ... 제 기간 내가 (20 및 22) 사이에 일을 입력하기 때문에,이했다. 그럼 난 시도하고 분명 결과를 반환하는 SQL, 위의를 사용하여 체크 '2015년 7월 23일'AND '2015년 7월 24일'를 추가합니다. 나는 23이 depart_date이기 때문에이 날짜 허용 할 수 있도록하는 방법이 필요합니다.

어떤 도움을 주시면 감사하겠습니다

또한 나는 또한 따라서 유사한 쿼리는 사용자가 입력되기 전에 예약 테이블에있는 사람들에게 블록 날짜를 확인하는 데 사용됩니다 차단 된 날짜 "booking_prev"을 보유하고 테이블이 있음을 언급해야한다.

해결법

  1. ==============================

    1.다음을 고려하세요...

    다음을 고려하세요...

    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 '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를 실행할 수 있습니다 - 사용자가 예약을 통해 중도 동안 아무도 그 날짜를 잡고하지 있는지 확인합니다.

  2. ==============================

    2.좋아, 허용 대답은 아주 잘 일을 잘하지만, 난 아직도 날짜를 차단 테이블에 추가하기 전에 주 예약 테이블에 날짜를 확인하고 주로하기 때문에 날짜 항목이 유효 확인해야했습니다. 어쨌든, 후속의 SQL은, 내가 필요로하는 모든 검사를 할 것 같다 :

    좋아, 허용 대답은 아주 잘 일을 잘하지만, 난 아직도 날짜를 차단 테이블에 추가하기 전에 주 예약 테이블에 날짜를 확인하고 주로하기 때문에 날짜 항목이 유효 확인해야했습니다. 어쨌든, 후속의 SQL은, 내가 필요로하는 모든 검사를 할 것 같다 :

    Select * From booking Where booking.unit_id = 58 And ((booking.arrive_date < '2015-07-23' And booking.depart_date >= '2015-07-24') OR (booking.arrive_date <= '2015-07-23' And booking.depart_date > '2015-07-24') OR (booking.arrive_date >= '2015-07-23' And booking.depart_date <= '2015-07-24') OR ('2015-07-23' > booking.arrive_date And '2015-07-23' < booking.depart_date ) OR ('2015-07-24' > booking.arrive_date And '2015-07-24' < booking.depart_date )) Limit 1 
    

    실망 약간은 모든 실제 삽입에 대한이 효율적이지 않습니다 비록, 내 요구 사항 중 하나 테이블에있는 값을 확인 않기 때문에 내가 준 솔루션을 아래로 표시된다.

    좀 더 내가 방지 예약 날짜를 저장할 테이블을 기반으로 사용하고있는 필드의 추가 허용 대답에 확대에 이동 :

    INSERT INTO의 booking_prevent (unit_id, FROM_DATE, TO_DATE, 주) (58)을 선택하고 '2015년 7월 28일', '2015년 7월 29일'(1을 선택) FROM '내 주'좌 y.from_date ON booking_prevent Y 가입 X < '2015년 7월 29일'AND y.to_date> '2015년 7월 28일'AND y.unit_id y.booking_prevent_id은 NULL의 LIMIT 1 = 58

    이것은 매우 잘 작동하지만이 유효한지 나는 다시 ... 항목에 업데이 트를 할 만 변화를 만들 수있는 방법 좀 붙어입니다. 이것은 내가 어둠 속에서 자상하다, 무엇을 가지고 :

    (선택 1)가 좌로부터 X '주 업데이트'요금 booking_prevent 세트 (unit_id, FROM_DATE, TO_DATE, 주) (58)을 선택하고 '2015년 7월 20일', '2015년 7월 26일가'ON y.from_date booking_prevent Y 가입 < '2015년 7월 26일'AND y.to_date> '2015년 7월 20일'AND y.booking_prevent_id가 NULL 인 y.unit_id = 58 = 466 WHERE booking_prevent_id LIMIT 1

    모든 포인터를 감상 할 수있다.

  3. from https://stackoverflow.com/questions/31346425/booking-calendar-arrive-depart-dates by cc-by-sa and MIT license