2014-04-11 1 views
0

테이블에서 다음 이벤트를 선택하고 싶습니다. 이벤트의 날짜는 date 컬럼에 Y-m-d 형식의 VARCHAR로 저장됩니다.다음 이벤트 선택

하지만 SQL에서 VARCHARS/strings를 비교하는 방법을 잘 모르겠습니다. 나는 다음을 시도했다. 그러나 그것은 나에게 과거의 이벤트를 준다.

$d = date("Y-m-d"); 
mysql_query("SELECT * FROM events WHERE date>$d ORDER BY date ASC LIMIT 1,1"); 

답변

1

당신은 당신의 날짜 문자열을 인용하지 않은, 그래서 따옴표가 없기 때문에 쿼리가 그대로

... AND date > 2014-04-11 ORDER ... 

처럼 somethign되며, MySQL은 간단한 수학 뺄셈로 날짜를 해석 할 무료이며, 당신은 시도

... AND date > 1999 ORDER ... 

하고 결국

... AND date > curdate() ... 

대신. PHP가 날짜를 생성하고 그것을 mysql에 전달하는 것은 아무런 의미가 없습니다. mysql이 그 날짜를 완벽하게 잘 생성 할 수있을 때입니다.

또한 PHP로 날짜를 생성하면 경쟁 조건이 발생할 수 있습니다. 예 : PHP는 "오늘 오후 11시 59 분 59 초"를 생성하지만 mysql은 실제로 "내일 00시"로 실행됩니다. 어쩌면 당신과 관련이 없겠지만, "밤새도록 운영되는"코드 뱅킹에서 말 그대로 수백만 달러의 비용이들 수 있습니다.

+0

좋아,하지만 : 오늘의 이벤트를 포함하지 않을 경우, >=

>에 sqlfiddle을 변경합니다. – clamp

+0

또한 날짜 필드를 실제 날짜/datetime으로 변환해야합니다. 이를 varchar로 저장하면 mysql이 자동으로 날짜/시간 비교 및 ​​연산을 수행 할 수 없게됩니다. –

+0

나는 동의하지만, 현재는 변경 될 수없고 문제는 VARCHAR로 해결되어야한다. – clamp

1
SELECT * FROM events WHERE active=1 AND DATEDIFF(date, CURDATE()) >= 0 ORDER BY date ASC LIMIT 1,1; 

오늘 이벤트를 포함한 다음 이벤트를 선택합니다. 아직도 다음 하나를 적어도 나에게 미래의 날짜를 준다, http://sqlfiddle.com/#!2/f205a3/9

+0

고마워,하지만 should not 그것은 각각 <= clamp

+0

@clamp'DATEDIFF'는 첫번째와 두번째 인자 사이의 날짜의 차이를 계산합니다. 이것은'date-CURDATE()'를 의미합니다. 앞으로 날짜가 정해지면 숫자는 긍정적이어야합니다. 예 : 연대순 : 4 월 30 일. 현재 날짜 : 4 월 12 일. 'DATEDIFF (4 월 30 일, 4 월 12 일) = 18'. – shrmn