2014-01-13 3 views
0

방아쇠 안에 있습니다. 모든 것이 잘 작동하지만 더 많은 일을해야합니다 :MySQL 데이터베이스, 날짜 형식, 트리거

테이블에 데이터를 삽입하기 전에 입력하려는 이벤트의 날짜의 차이가 최소 1 일인지 확인해야합니다.

즉, 목표 : 데이터베이스에 이미 2014-01-01 19:00:00 날짜가 있고 2014-01-01 날짜 (다른 레코드로)를 넣으려고하는 경우 언제든지 나를 풀어 주면 안된다. 최소 1 일 차이 만 허용됩니다.

그래서,이 (훨씬 더 많은 코드가 있기 때문에, 트리거에서 부분)이 어떻게하는지입니다 :

DECLARE k INT DEFAULT 0; 

/* This is where I get the error, ABS is to make it always positive to go through 
checking, 
so that it wont matter whether the NEW date is before or after */ 

SELECT ABS(DATEDIFF(DATE_FORMAT(`performance_date`, '\'%Y-%m-%d %H:%i:%s\''), 
DATE_FORMAT(NEW.`performance_date`, '\'%Y-%m-%d %H:%i:%s\''))) INTO k; 

/* This part is not the problem, it's been tested in other cases */ 

IF k = 0 THEN 
    SIGNAL SQLSTATE '58005' 
    SET MESSAGE_TEXT = 'Wrong! Only 1 performance in 1 club is allowed per day! Change your date, or club!'; 
END IF; 

오류 코드 : 1054 알 수없는 열 'performance_date' '필드 목록'

에서

나는 또한 간단한 시도했습니다 ...DATEDIFF(`performance_date`, NEW.`performance_date`);.

답변

1

당신은 많은 항목이 당신의 시간과 일치하는 데이터베이스에 이미있는 방법 COUNTSELECT ... INTO var_list 쿼리를 사용할 수 있습니다

난 당신이 하루에 하나 개의 항목을 의미 있으리라 믿고있어, 그리고 나는 있으리라 믿고있어 그 performance_dateDATETIME 또는 TIMESTAMP 유형입니다. 명확성을 위해

DECLARE k INT DEFAULT 0; 

/* Count number of performances occurring on the same date as the 
    performance being inserted */ 
SELECT COUNT(*) 
FROM tbl 
WHERE performance_date 
BETWEEN DATE(NEW.`performance_date`) 
AND DATE(DATE_ADD(NEW.`performance_date`, INTERVAL 1 DAY)) 
INTO k; 

/* If k is not 0, error as there is already a performance */ 
IF k != 0 THEN 
    SIGNAL SQLSTATE '58005' 
    SET MESSAGE_TEXT = 'Wrong! Only 1 performance in 1 club is allowed per day! Change your date, or club!'; 
END IF; 

, 당신은 2014년 1월 1일 19시 0분 0초로 performance_date과 성능을, 그리고 당신과 함께 새로운 성능을 삽입하면 날짜 2014년 1월 1일 8시 30분 0초 (예를 들어,

SELECT COUNT(*) 
FROM tbl 
WHERE performance_date 
BETWEEN DATE("2014-01-01 08:30:00") AND DATE(DATE_ADD("2014-01-01 08:30:00", INTERVAL 1 DAY)) 
# The line above will become: 
# BETWEEN "2014-01-01" AND "2014-01-02" 
INTO k 
+0

그리고 performance_date'이 NEW.performance_date'와''사이'경우 어떻게 :) 다음 위의 코드는 그 오류를 제공하기 위해 트리거가 발생합니다 (1)의 수를 반환하는,이 쿼리를 실행합니다 NEW.performance_date - 1'? –

+0

예제에서 'NEW.performance_date - 1'은'2013-12-31 19 : 00 : 00'과 같으므로 '2013-12-31 19 : 00 : 00'부터 '2013-12'까지 -31 23 : 59 : 59'은 2014-01-01 00 : 00 : 00부터 2014-01-01 23 : 59 : 59까지 모든 일은 괜찮을 거라고 생각합니다. 쿼리와 일치하므로 "새 이벤트를 추가하려는 날에 이미 이미 이벤트가 있습니다"라고 플래그가 지정됩니다. – Jon

+0

공연 사이에 24 시간이 필요하다는 것을 의미합니까? 하루 만에 두 가지 행사를 가질 수는 없습니까? – Jon