2008-11-13 1 views
2

날짜 문자열 형식에 따라 다른 행을 반환하는 MySQL (v 5, MyISAM) 쿼리가 있습니다.일치하지 않는 MySQL 날짜 비교 YYYY/MM/DD 대 YYYY-MM-DD

(1) IFNULL(date1, ADDDATE('2008/10/31 23:59:59',INTERVAL 1 DAY)) > '2008-10-31 23:59:59' 
(2) IFNULL(date1, ADDDATE('2008/10/31 23:59:59',INTERVAL 1 DAY)) > '2008/10/31 23:59:59' 

(3) date1 > '2008-10-31 23:59:59' 
(4) date1 > '2008/10/31 23:59:59' 

'>'비교 연산자 '의 오른쪽에'.

(1) 75,098 rows *expected* 
(2) 0 rows *DIFFERENCE* 
(3) 199 rows *simple case as expected* 
(4) 199 rows *simple case as expected* 

질문 - 왜요?

답변

2

짧은 답변 : 사용 CAST(... AS DATE)

긴 대답 :

MySQL DATE type에서 :

A "편안한"구문이 허용 : 모든 구두점 문자 구분 기호 사이에 사용할 수있다 날짜 부분 또는 시간 부분. 예를 들어 '98 -12-31 11:30:45 ', '98 .12.31 11 + 30 + 45', '98/12/31 11 * 30 * 45 '및 '98 @ 12 @ 31 11^30^45 '는 동등합니다. 당신이 ADDDATE를 사용하여 실시 예 1 및 2에서

...이 항상 함께 날짜를 반환하지 않습니다 - 상관없이 입력 형식, 분리 '': 당신은

+-----------------------------------------------+ 
| ADDDATE('2008/10/31 23:59:59',INTERVAL 1 DAY) | 
+-----------------------------------------------+ 
| 2008-11-01 23:59:59       | 
+-----------------------------------------------+ 

또한 형식 정보를 잃는 IFNULL을 사용하므로 문자열을 비교할 때 형식을 비교합니다.

당신은 일이 다시 캐스팅 할 수있는 일 :

mysql> SELECT IFNULL(null, ADDDATE('2008/10/31 23:59:59',INTERVAL 1 DAY)) > '2008/10/31 23:59:59'; 
+-------------------------------------------------------------------------------------+ 
| IFNULL(null, ADDDATE('2008/10/31 23:59:59',INTERVAL 1 DAY)) > '2008/10/31 23:59:59' | 
+-------------------------------------------------------------------------------------+ 
|                     0 | 
+-------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 


mysql> SELECT CAST(IFNULL(null, ADDDATE('2008/10/31 23:59:59',INTERVAL 1 DAY)) AS DATE) > '2008/10/31 23:59:59'; 
+---------------------------------------------------------------------------------------------------+ 
| CAST(IFNULL(null, ADDDATE('2008/10/31 23:59:59',INTERVAL 1 DAY)) AS DATE) > '2008/10/31 23:59:59' | 
+---------------------------------------------------------------------------------------------------+ 
|                         1 | 
+---------------------------------------------------------------------------------------------------+ 
+0

내 대답은 문자열 - 날짜 변환을 완전히 놓쳤다 :-) – TToni

0

mysql에 대해 많이 알지는 못하지만 "/"기반 날짜가 "YYYY/DD/MM"로 해석되어 완전히 유효하지 않을 수 있습니까? SQL Server에서는이 경우 예외가 발생할 것으로 예상되지만, mysql이 "유효하지 않은 날짜"값을 사용하면 차이를 설명 할 수 있습니다.

YYYY-MM-DD는 공식 ISO 형식입니다. YYYY/MM/DD 나는 들어 본 적이 없다.

0

참조 짧은 답변 : (DATE AS ...) 사용 CAST를

좌변은 (1)과 (2) 평가를 변경하는 RHS도 마찬가지이며 문자열입니다.

Ref "/"기준일.

'2008/10/31 23:59:59'가 잘못된 날짜 인 경우 성공한 유일한 날짜 인 옵션 (1), (3), (4)에서 실패합니다. ''2008-10-31 23:59:59 '가 잘못된 날짜 인 경우 성공한 옵션 (1), (3)에서 실패합니다.