start date, end date에 포함되지 않는 구간 찾기 0 3 534

by 기훈 [MySQL] [2022.01.19 22:59:16]


예약 테이블입니다.

room_number: string

start_date: datetime

end_date: datetime

로 지정되어있습니다.

몇번 룸의 start_date부터 end_date까지 예약 데이터가 저장됩니다.

예약 된 것을 찾는 조건은 start_date <= 종료일 and end_date >= 시작일 하면 되는데

시작일, 종료일 범위 날짜로 예약 가능한 방을 찾는 날짜 조건은 어떻게 주어야 할까요?

by 마농 [2022.01.20 00:51:29]

오전 퇴실, 오후 입실 한다면?
이전 예약 종료일과 이후 예약 시작일은 겹칠 수 있을 듯 합니다.
따라서 조건에서 등호(=)는 빠져야 할 것 같구요.
전체 룸번호에서 예약된 룸번호를 빼면 되겟네요.
 

SELECT room_number
  FROM 룸_테이블
 MINUS
SELECT room_number
  FROM 예약_테이블
 WHERE start_date < 종료일
   AND end_date   > 시작일
;

 


by 기훈 [2022.01.20 01:36:43]

답변 감사합니다 :)

mysql에서는 not exists해야 하는거죠?

not exists하지 않고 할수 있는 방법이 있을까요?


by 마농 [2022.01.20 08:34:23]

MySQL 에서는 MINUS 가 안되는 군요
 

-- NOT EXISTS --
SELECT room_number
  FROM 룸_테이블 m
 WHERE NOT EXISTS (SELECT 1
                     FROM 예약_테이블
                    WHERE start_date < 종료일
                      AND end_date   > 시작일
                      AND room_number = m.room_number
                   )
;
-- NOT IN --
SELECT room_number
  FROM 룸_테이블
 WHERE room_number NOT IN (SELECT room_number
                             FROM 예약_테이블
                            WHERE start_date < 종료일
                              AND end_date   > 시작일
                           )
;
-- OUTER JOIN & IS NULL --
SELECT m.room_number
  FROM 룸_테이블 m
  LEFT OUTER JOIN 예약_테이블 s
    ON s.start_date < 종료일
   AND s.end_date   > 시작일
   AND s.room_number = m.room_number
 WHERE s.room_number IS NULL
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입