2013-11-26 2 views
-1

만료 내 쿼리입니다 경우 내가 행을 삭제하는 쿼리를해야합니다 : 나는 그것을 실행하면날짜가 여기에

DELETE FROM `upcoming` WHERE `Date` < DATE_FORMAT(CURDATE(), '%M-%d-%y') 

, 그것은 내 테이블의 모든 것을 삭제합니다. 날짜는 예정된 일정 날짜를 입력하는 열입니다. 이것은 내 테이블에있는 것입니다. 두 날짜가 아닌 한 날짜 만 삭제해야합니다.

테이블 :

12-25-13 
11-11-13 

오늘 날짜 :

11-25-13 
+0

mysql에 'date' 예약어가 없습니까? – Babblo

+2

날짜가 mm-dd-yy로 지정된 경우 mm/dd/yy를 사용하는 쿼리가 왜 발생합니까? –

+0

도움이 될 수 있습니다 : [5 일이 넘은 모든 행 삭제] (http://stackoverflow.com/questions/5853543/deleting-all-rows-older-than-5-days) – showdev

답변

0

는 규범적인 패턴이 저장 날짜 값에 DATE 데이터 유형을 사용하는

DELETE FROM `upcoming` WHERE STR_TO_DATE(`Date`, '%M-%d-%y') < DATE_FORMAT(CURDATE(), '%M-%d-%y') 
0

입니다보십시오.

'날짜'값을 'mm-dd-yy'형식의 VARCHAR로 저장하는 것으로 보입니다. VARCHAR 표현식의 비교는 왼쪽에서 오른쪽으로 문자 단위로 수행됩니다. 달이 처음 인 문자 표현은 정식 순서가 아닙니다. 즉, 일종의 mm-dd-yy 값은 날짜 순서로 정렬되지 않습니다. '01 -01-13 '(2013 년 1 월)은 '11 -27-12'(11 월 2012) 이전에 정렬됩니다.

SQL 문과 관련하여 가장 간단한 방법은 VARCHAR을 DATE 데이터 유형으로 변환하고이를 DATE을 반환하는 표현식과 비교하는 것입니다.

DELETE FROM `upcoming` WHERE STR_TO_DATE(`Date`,'%m-%d-%y') < CURDATE() 

성능면에서 MySQL은이 조건자를 만족시키기 위해 인덱스 범위 검사를 수행 할 수 없습니다. 테이블의 모든 행을 검토하여 변환을 수행 한 다음 비교를 수행해야합니다. 컬럼이 DATE으로 저장된 경우, bare 컬럼은 술어에서 참조 될 수 있고 MySQL은 인덱스 범위 스 5을 사용할 수 있습니다.


는 또한 : '%M' 형식 지정은 월 이름, '1월', '2월'등 '%m' 지정 숫자 달 '01', '02'을 리턴를 반환합니다.