[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.다음을 고려하세요...
다음을 고려하세요...
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.좋아, 허용 대답은 아주 잘 일을 잘하지만, 난 아직도 날짜를 차단 테이블에 추가하기 전에 주 예약 테이블에 날짜를 확인하고 주로하기 때문에 날짜 항목이 유효 확인해야했습니다. 어쨌든, 후속의 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
모든 포인터를 감상 할 수있다.
from https://stackoverflow.com/questions/31346425/booking-calendar-arrive-depart-dates by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 레일과 PostgreSQL을 사용하여 발생으로 그룹화 된 목록을 반환 (0) | 2020.07.19 |
---|---|
[SQL] 기능을 가진 두 개의 열을 반환하는 방법 (0) | 2020.07.19 |
[SQL] PostgreSQL을에서 id 컬럼 위치가 중요한가요? (0) | 2020.07.19 |
[SQL] 한 열에서 여러 행을 삽입하는 방법 [마감] (0) | 2020.07.19 |
[SQL] SqlCommand를 INSERT INTO 쿼리가 실행되지 않습니다 (0) | 2020.07.19 |