2012-11-22 2 views
2

다음 열이있는 데이터베이스 테이블이 있습니다. 날짜의 사용자 입력, 시작 시간과 종료 시간에 데이터베이스 테이블에서 시간 슬롯을 사용할 수 있는지 확인합니다.

+----+---------------------+---------------------+------------------+ 
| id | start_datetime  | end_datetime  | arena_surface_id | 
+----+---------------------+---------------------+------------------+ 
| 1 | 2012-11-22 02:30:00 | 2012-11-22 05:00:00 |    2 | 
| 2 | 2012-11-22 00:00:00 | 2012-11-22 02:30:00 |    2 | 
| 3 | 2012-11-22 05:00:00 | 2012-11-22 08:00:00 |    2 | 
| 4 | 2012-11-22 08:00:00 | 2012-11-22 11:00:00 |    2 | 
| 5 | 2012-11-22 11:00:00 | 2012-11-22 17:00:00 |    2 | 
+----+---------------------+---------------------+------------------+ 

, 나는 시간의 주어진 기간 내에 특정 arena_surface_id에 따른 경고를 어떤 슬롯이 있는지 알아 싶어요.

예를 들어 사용자 입력 인 경우.

start_datetime : 2012-11-22 6:00 
end_datetime : 2012-11-22 9:00 
arena_surface_id : 2 

은 내가 (이 일치해야 위의 예에서) 지정된 날짜 시간 6:00 9:00 사이의 시간 슬롯을 일치하는 모든 행이 있는지 알고 싶습니다.

무엇이 적절한 mysql 쿼리가 될까요?

이 실제로이 how would I detect a non-overlap of two time periods?

UPDATE이 @March

에 대한 후속 질문은 내가 당신의 쿼리를 사용할 때 반환하는 것입니다.

SELECT 
    id, 
    start_datetime, 
    end_datetime, 
    arena_surface_id 
FROM 
    gce_arena_surface_booking 
WHERE 
    (start_datetime BETWEEN '2012-11-22 04:00:00' AND '2012-11-22 09:00:00') 
OR 
    (end_datetime BETWEEN '2012-11-22 4:00:00' AND '2012-11-22 9:00:00') 


+----+---------------------+---------------------+------------------+ 
| id | start_datetime  | end_datetime  | arena_surface_id | 
+----+---------------------+---------------------+------------------+ 
| 1 | 2012-11-22 02:30:00 | 2012-11-22 05:00:00 |    2 | 
| 3 | 2012-11-22 05:00:00 | 2012-11-22 08:00:00 |    2 | 
| 4 | 2012-11-22 08:00:00 | 2012-11-22 11:00:00 |    2 | 
+----+---------------------+---------------------+------------------+ 

중간 레코드가 조건과 일치하지 않고 계속 가져옵니다.

+0

이 http://mattgemmell.com/2008/12/08/what-have-you-tried/ – Ankur

답변

7

SELECT * 
FROM yourTable 
WHERE (startTime BETWEEN 'yourStartImput' AND 'yourEndImput') OR (endTime BETWEEN 'yourStartImput' AND 'yourEndImput') 

에 대해 시작하거나 입력 사이에 끝나는 일치하는 항목이 있다면 그래서 당신은 확인 방법. 귀하의 코멘트를 들어

, 최종 쿼리는 다음과 같아야합니다

SELECT * 
FROM yourTable 
WHERE ((startTime BETWEEN 'yourStartImput' AND 'yourEndImput') 
    OR (endTime BETWEEN 'yourStartImput' AND 'yourEndImput')) 
    AND arena_surface_id = 1 
+0

내가이 방법을 사용하여 시도 그리고 그것은 구문 오류를 제공합니다. 'SELECT * FROM gce_arena_surface_booking WHERE (시작 날짜 2012-11-22 4:00 및 2012-11-22 9:00) 또는 (2012-11-22 4:00 및 2012-11-22 9:00 사이의 end_datetime); ' –

+0

날짜 주위에 작은 따옴표가 필요합니다. – Marc

+0

예, 지금 가져 오지만 중간에 잘못된 레코드 하나가 있습니다. 병이 돌아 오는 것에 내 질문을 업데이트하면 질문을 들여다 볼 수 있습니다. –

관련 문제