2011-03-21 3 views
2

날짜 비교를 수행하고 데이터 집합을 반환해야했습니다. PHP는 (08:00:00) 대신 오전 8시에 0이 아닌 시간 (8:00:00)으로 현재 시간을 보냈습니다. 선행 0이없는 경우 잘못된 결과가 나타납니다. 왜 누군가가 설명 할 수 있습니까? 테스트하려면Mysql date comparision (같음) 앞에 0이없는 경우

SELECT IF(DATE_ADD('2011-03-20', INTERVAL '08:05:00' HOUR_SECOND) >= '2011-03-20 8:00:00',"yes","No")

결과를 실행 : 없음

SELECT IF(DATE_ADD('2011-03-20', INTERVAL '08:05:00' HOUR_SECOND) >= '2011-03-20 08:00:00',"yes","No")

결과 : 예

모두가 결과를주지해야한다 : "예"를

d입니까? 0이 아닌 0에 대한 문자열 비교?

+2

문제의 근원 인 'DATE_ADD'에 대한 참조를 삭제하기 위해 원래 질문을 편집하여 질문을 약간 다르게 만듭니다. –

+0

혼란에 사과드립니다. 위와 같은 예제를 실행하면 단순하게하기 위해 노력했지만 너무 실패합니다. – Stewie

+0

위의 예는 다른 이유로 실패합니다. 날짜에 대한 참조를 절대 만들지 않습니다. MySQL은 정규 문자열이 아닌 것으로 알고 있습니다. –

답변

3

이것은 MySQL이 오히려 꼴 사나운 날짜/시간 처리와 관련이 있다고 생각합니다. MySQL은 숫자로 변환하고 다른 경우에는 문자열 비교를 사용합니다.

http://dev.mysql.com/doc/refman/5.0/en/using-date.html

수동

에서

당신이 <, < =, =,> =,>와 상수 문자열로 DATE, TIME, DATETIME, 또는 TIMESTAMP를 비교할 때, 또는 사업자 사이 MySQL은 일반적으로 빠른 비교를 위해 문자열을 내부의 긴 정수로 변환합니다 (그리고 좀 더 "편안한"문자열 검사도). 그러나,이 변환은 다음과 같은 예외가 될 수 있습니다 :

당신이 다른 비교를 사용할 때 표현

에 DATE, TIME, DATETIME, 또는 TIMESTAMP 컬럼을 비교하면 두 개의 열

비교 메서드가 IN 또는 STRCMP()와 같이 나열된 것보다 더 큽니다.

이러한 예외적 인 경우 비교는 개체를 문자열로 변환하고 문자열 비교를 수행하여 수행됩니다.

+0

아 하! 돈에 바로 – Stewie

3

엄밀히 말하면 문자열 (날짜가 아님)과 비교하고 자동 주조에 의존합니다. 대신이 시도 :

SELECT 
IF(DATE_ADD('2011-03-20', INTERVAL '08:05:00' HOUR_SECOND) >= STR_TO_DATE('2011-03-20 8:00:00', '%Y-%m-%d %H:%i:%s'), 'Yes', 'No'), 
IF(DATE_ADD('2011-03-20', INTERVAL '08:05:00' HOUR_SECOND) >= STR_TO_DATE('2011-03-20 08:00:00', '%Y-%m-%d %H:%i:%s'), 'Yes', 'No') 

업데이트 :

According to the manual

, DATE_ADD() 날짜를 반환 할 수 있습니다 또는 문자열 :

: 반환 값이 인수에 따라

DATETIME if the first argument is a DATETIME (or TIMESTAMP) value, 
or if the first argument is a DATE and the unit value uses HOURS, 
MINUTES, or SECONDS. 

String otherwise. 

결과가 DATETIME이되도록 을 사용하면 CAST()를 사용하여 첫 번째 인수를 DATETIME으로 변환 할 수 있습니다.

따라서 >= 비교의 왼쪽 피연산자는 문자열이므로 문자열 비교가 발생합니다. CAST('2011-03-21' AS DATE) 제안을 시도하십시오.

+0

hmm .. 맞습니다. 그러나 MySQL은 datetime 비교에서 시간 변환을위한 내부 문자열을 사용한다고 생각했습니다. "date_time_field"> = '2011-03-20 8:00:00' – Stewie

+0

감사합니다. 대답이 도움이되었습니다 .. upvoted – Stewie

+0

사실, 문제는' ADD_DATE'. 내 대답을 업데이트 할게. –