2011-02-24 10 views
1

테이블의 값을 변경하기 위해 MySQL에서 이벤트를 만들고 싶습니다. 이 이벤트는 날짜 (특히 TIMESTAMP 필드의 TIME() 부분)가 현재 날짜보다 많은지 여부를 확인합니다. 분명히 'active'라는 테이블에 time_stampactive 열이 있습니다. 이것은 내가 지금까지 내가 본대로MySQL 이벤트를 사용하여 값 업데이트

CREATE EVENT update_status 
ON SCHEDULE EVERY 2 SECOND 
DO 
SELECT @time:= time_stamp FROM active WHERE user_id = 1; 
SELECT @time2:= TIMESTAMP(@time); 
SELECT @active:=TIMEDIFF(@time2,DATE_ADD(NOW(),INTERVAL -15 SECOND)); 
UPDATE active SET active=if(TIME_TO_SEC(TIME(@active))>=0,1,0) WHERE user_id=1; 

이 무엇인가, 변수와 SELECT 부분은 벌금, 즉, TIME_TO_SEC은 (시간은 (@active)) (15) (제공 I로 시작하는 회귀 계수처럼 보이는 작품 'time_stamp'필드를 올바르게 업데이트했습니다.)

의도 된 동작은 TIME_TO_SEC (TIME (@active))가 0에 도달하면 UPDATE 쿼리가 '활성'필드의 값을 1에서 0 (기본값은 1)으로 변경한다는 것입니다. 그러나 아무 것도하지 않습니다.

업데이트 : : 정확히 말하면 TIME_TO_SEC (TIME (@active))가 여전히 양수일 때 값을 0으로 변경하는 경우가 있습니다.

두 번째 업데이트 : 나는 최근에이 일을 시도 :

CREATE EVENT update_status 
ON SCHEDULE EVERY 2 SECOND 
DO 
SELECT @time:= time_stamp FROM active WHERE user_id = 1; 
SELECT @time2:= TIMESTAMP(@time); 
SELECT @active:=TIMEDIFF(@time2,DATE_ADD(NOW(),INTERVAL -15 SECOND)); 
UPDATE active SET active=0 WHERE user_id=1 AND TIME_TO_SEC(TIME(@active))>=0; 

중 하나가 작동하지 않았다.

세 번째 업데이트 : 예상대로 작동하지 않더라도 Adam과 내가 제안한 것을 사용했습니다. 이벤트를 시작한 후 확실히 '활성'값이 0으로 변경됩니다. 아이디어?

해결 : 의도 한대로 작동

CREATE EVENT update_status 
ON SCHEDULE EVERY 2 SECOND 
Do 
UPDATE active AS t 
SET t.active=IF(TIME_TO_SEC(TIMEDIFF(
t.time_stamp, DATE_ADD(NOW(), 
INTERVAL -15 SECOND)))>=0,1,0) 
WHERE user_id=1 

: 아담 덕분에, 나는 IF 문을 사용하여 자신의 코드를 사용했다. 그래도 그의 제안이 효과가 없었던 이유는 아닙니다.


어디에서 실수 했습니까?

물론이 기능을 사용하기위한 또 다른 방법은 크게 감사하겠습니다.

미리 감사드립니다.

답변

5

active.time_stamp의 값은 무엇입니까? active.user_id = 1?

또한 귀하의 진술이 더 간단하게 작성 될 수 있다고 생각합니다.

  1. 는 사실 time_stamp 타임 스탬프는 다음 TIMESTAMP()에 대한 호출이 필요하지 않습니다 포함되어있는 경우.

  2. TIMEDIFF(expr1,expr2) returns expr1 – expr2 expressed as a time value이므로 UPDATE 쿼리에서 TIME() 함수를 제거하십시오.

    CREATE EVENT update_status 
    ON SCHEDULE EVERY 2 SECOND 
    DO 
    UPDATE active t 
    SET t.active = 0 
    WHERE t.user_id = 1 
    AND TIME_TO_SEC(
        TIMEDIFF(
         t.time_stamp, DATE_ADD(NOW(),INTERVAL -15 SECOND) 
        ) 
    )>=0; 
    

    내가 active.time_stamp의 값이 지금보다 큰 경우,이 이벤트가 0

    active.active의 값을 설정하는 것을 테스트 한 :

그래서 이것은 내가 명세서를 작성하는 방법입니다

만약 그 여전히 당신은 또한 같은 아주 기본적인 것을 시도 할 수 있습니다 작동하지 않습니다 :

CREATE EVENT update_status_test 
ON SCHEDULE EVERY 1 SECOND 
DO 
UPDATE active t 
SET t.active = 0 
WHERE t.user_id = 1; 

그리고 여전히 작동하지 않는다면 이벤트 스케줄러가 실제로 실행 중인지 확인하십시오. 를 시작하는 여러 가지 방법이 하나있다 : SET GLOBAL event_scheduler = 1

기타 참고 사항 :
이 지금은 중요하지 않을 수 있지만, 시간이 당신에 간다 결국 TIME type in MySQL의 상한으로 실행됩니다.

+0

답변 해 주셔서 감사합니다. active.time_stamp 값은 일반적인 TIMESTAMP 값입니다 (예 : 2011-02-24 00:09:06). 나는 쿼리의 단순화를 좋아하지만 작동하지 않습니다. 두 번째 미리보기가 작동했습니다. 그건 그렇고, TIMESTAMP() 값을 이미 TIMESTAMP 경우에도 나는 (예를 들어 @time) 변수를 설정할 때, 형식을 유지하지 않았다; 대신 문자로 된 긴 자릿수를 보여주었습니다. 더 이상의 아이디어? –

+0

관련성이있는 경우를 대비하여 localhost를 사용하고 있습니다. 그건 그렇고, 당신이 "UP ** Active ** AS ** t"를 의미한다고 생각합니다. –

+0

당신의 대답을 받아 들였습니다. 그러나 나는 문제의 편집으로 작업 해결책을 게시했습니다 :-) –

관련 문제