2009-10-18 4 views
4

에 문자열로 MySQL의 "시간"필드 비교 :다음 정보와 함께 내가, 내 데이터베이스의 특정 행이 PHP

data: 

    user_id  start_time  end_time 
     405  12:00:00   14:00:00 

나는 다음과 같은 SELECT 문이 : 이제

 SELECT * 
     FROM data 
     INNER join users on users.user_id = data.user_id 
      WHERE NOT EXISTS 
      (SELECT * FROM data 
      WHERE '10:00:00' BETWEEN start_time AND end_time) 
      GROUP BY users.usrID"); 

을, 이 쿼리는 위의 행 (사용자 405)을 반환하지만, 아무도 반환하지 않는다고 생각합니다. (10:00:00은 12:00:00에서 14:00:00 사이가 아니기 때문에).

흥미롭게도 10:00:00에서 07:00:00 사이의 값을 변경하면 정상적으로 작동합니다.

이것이 작동하지 않는 이유는 무엇입니까? 데이터베이스에서 TIME으로 설정 한 필드는 다음과 같습니다. 00:00:00

대단히 감사합니다.

업데이트 :

나는 다음과 같이 주위에 내 쿼리를 변경 :

SELECT usrID, 
     first, 
     last 
    FROM users 
WHERE user_id NOT IN (SELECT u.user_id 
         FROM `data` d, 
           `users` u 
         WHERE d.user_id = u.user_id 
          AND CAST('10:00:00' AS TIME) BETWEEN start_time AND end_time) 
ORDER BY u.user_id 

그리고 이것은 트릭을 할 것 같았다. 모든 도움에 감사드립니다. between에 대한 MySQL의 설명서 페이지 당

답변

1

보십시오 : 당신이 얻을 때

SELECT * 
    FROM DATA d 
    JOIN USERS u ON u.user_id = d.user_id 
    WHERE NOT EXISTS (SELECT NULL 
         FROM DATA t 
         WHERE t.id = d.id 
         AND CONVERT('10:00:00', TIME) BETWEEN t.start_time AND t.end_time) 
GROUP BY u.usrID 

적절하게 평가 사이에, 당신은 당신이 그런가 것을 알 것 하위 쿼리를 서로 연관시키는 것은 동일한 테이블이기 때문에 하위 쿼리가 연결되어 있다는 것을 의미하지는 않습니다.

+0

안녕하세요. Rexem. 하위 쿼리를 서로 연관시켜야 할 필요가 있습니다. 나는 이것을 아주 잘 벗겨진 예에서 작동시킬 수있었습니다. 그러나 사용자 테이블에 가입하면 문제가 발생합니다.10시 방향 아래에있는 항목을 '제외'할 것입니다. 그러나 사용자가 테이블에 '2'개의 항목을 가지고 있고 (10:00:00, 12:00:00) 및 (13:00:00, 14:00:00)라고 가정하면 쿼리가 두 번째 집합 (10:00:00 사이가 아니기 때문에)을 설정하고 사용자를 사용할 수 있다고 돌려줍니다. 쿼리가 10:00:00을 찾으면 사용자를 완전히 무효로 할 수 있도록 어떻게 수정해야합니까? – Dodinas

+0

신경 쓰지 마라, 나는 그것을 얻었다 고 생각한다. 내 원래 게시물에 내 설명을 참조하십시오. – Dodinas

3

:

"날짜 또는 시간 값 BETWEEN 사용하는 경우, 당신은 명시 적으로 원하는 데이터 형식으로 값을 변환 할 CAST()를 사용해야 최상의 결과를 예 :. 당신이 만약 DATETIME을 두 개의 DATE 값과 비교하고 DATE 값을 DATETIME 값으로 변환하십시오 .DATE에 대한 비교에서 '2001-1-1'과 같은 문자열 상수를 사용하는 경우 문자열을 DATE로 캐스트하십시오. "

시도 : 명시 적 타입 캐스트없이

SELECT * 
FROM data 
    INNER join users on users.user_id = data.user_id 
WHERE NOT EXISTS 
    (
    SELECT * 
    FROM data 
    WHERE CAST('10:00:00' AS TIME) BETWEEN start_time AND end_time 
    ) 
GROUP BY users.usrID 

는, MySQL은 비교를 위해 문자열 리터럴로 시간 값을 변환보다는 시간 값 리터럴 문자열을 변환 할 수있다.

+0

답장을 보내 주셔서 감사합니다. James. 귀하의 솔루션이 그 행을 반환 할 것이라고 확신했지만, 여전히 비어있게됩니다. 다시 07:00:00을 입력하면 반환됩니다. – Dodinas

+0

다른 사람이 아이디어를 가지고 있다면, 좋을 것입니다. – Dodinas

+0

'CONVERT ('10 : 00 : 00 ', TIME)'과 함께 CAST ('10시 : 시작 시간과 종료 시간 사이의 '10 : 00 : 00'사이의 시간)은 정상적으로 작동하며, MySQL 4.1을 사용하여 –

2

나는 '10 : 00 : 00 '시간이 시간이 아닌 문자열로 취해지고 있다고 생각합니다. 그것은 '07 : 00 : 00 '이 다른 결과를주는 이유를 설명합니다. 한 번에 값을 전송 해 봅니다 ... 나는 구문이 생각 뭔가 같은 :

cast('10:00:00' as time) 
관련 문제