2012-07-03 3 views
1

start_date, end_date 및 간격이있는 테이블이 있습니다. start_date 값과 간격으로 end_date을 업데이트하고 싶습니다.테이블에서 간격을 사용하여 날짜를 계산하는 방법

create table date_test (
    start_date  date, 
    end_date  date, 
    date_interval varchar(45) 
); 

내가 date_interval을 위해 사용하고 값은 + INTERVAL 1 MONTH, - INTERVAL 1 WEEK 같다.

- '간격 일주 2012-01-01'

나는 같은 것을 할 싶습니다

UPDATE date_test SET end_date = date(concat(start_date, " ", date_interval)); 

을하지만 난이 경고를 얻을 :

1292 잘린 잘못된 날짜 값을

업데이트하기 전에이 날짜를 강제 평가하려면 어떻게해야합니까?

UPDATE date_test SET end_date = DATE_ADD(start_date, date_interval); 

하지만 두 번째 매개 변수로 DATE_INTERVAL 사용하면 작동이 않는 경우에 저희에게 말할 것이다 모르겠어요 :

+0

당신은 DATE_ADD 사용 할 수 있습니다. 지금은 답변을 게시/확인할 수 없지만 제대로 작동합니다. –

답변

0

은 당신이하고 싶은 것입니다.

많은 유용한 예제가 MySQL 설명서에서 찾을 수 있습니다. DATE_ADD() 기능 설명을 참조하십시오.

+0

거의; 하지만 매뉴얼 페이지와 질문 사이에 중요한 차이가 있습니다. 이 매뉴얼은'DATE_ADD (date_value, interval '1'DAY)'등을 다루고 있지만 질문은 두 번째 매개 변수로 'string'값을 가질 것이다. 질문에 문자열을 INTERVAL 유형으로 변환하는 함수가 필요할 것 같아 걱정됩니다. MySQL에는 'TO_INTERVAL'함수가없는 것으로 나타났습니다. –

+0

Jonathan, 귀하의 의견을 바탕으로 또 다른 답변을 추가했습니다. –

0

MySQL은 평가할 값을 지원하지 않습니다. 따라서 UPDATE 문을 직접 사용할 수는 없습니다. 이 경우

내가 당신에게 다음과 같은 방법으로 좋을 것 :

  • 는 SELECT 쓰기 ... OUTFILE 문 INTO 바로 다음 파일에 업데이트 statemants 및 출력이 모든 문장의 목록을 생성 할 이 sript를 실행하십시오.

  • 또는 date_test 테이블에 커서를 열 수있는 저장 프로 시저를 작성하여 준비된 문을 사용하여 각 레코드에 대해 UPDATE 문을 하나씩 생성하고 실행하십시오.

솔루션에 대해 궁금한 점이 있으면 질문하십시오.

1

조나단 레플러는 말했다 :

거의; 하지만 매뉴얼 페이지와 질문 사이에 중요한 차이가 있습니다. 매뉴얼은 DATE_ADD (date_value, INTERVAL '1'DAY) 등을 논하고, 질문은 두 번째 매개 변수로 'string'값을 가지게됩니다. 질문에 문자열을 INTERVAL 유형으로 변환하는 함수가 필요할 것 같아 걱정됩니다. MySQL에는 'TO_INTERVAL'함수가없는 것으로 나타났습니다.

여기에는 첫 번째 매개 변수로 날짜를 사용하고 두 번째 매개 변수로 문자열 간격을 사용하는 함수가 있습니다.

은 단순히 데이터베이스에 다음 저장 프로 시저를 추가

CREATE PROCEDURE my_date_add(d DATE, i VARCHAR(50)) 
BEGIN 
    DECLARE sign CHAR(1); 
    DECLARE x INT; 

    SET sign = SUBSTRING_INDEX(i, ' ', 1); 
    SET x = SUBSTRING_INDEX(SUBSTRING_INDEX(i, ' ', -2), ' ', 1); 

    IF sign = '-' THEN 
    SET x = -x; 
    END IF; 

    CASE SUBSTRING_INDEX(i, ' ', -1) 
    WHEN 'DAY' THEN SELECT DATE_ADD(d, INTERVAL x DAY); 
    WHEN 'WEEK' THEN SELECT DATE_ADD(d, INTERVAL x WEEK); 
    WHEN 'MONTH' THEN SELECT DATE_ADD(d, INTERVAL x MONTH); 
    END CASE; 
END 

그런 다음 당신은 다음과 같은 테이블을 업데이트 할 수 있어야한다 :

UPDATE date_test SET end_date = my_date_add(start_date, date_interval); 
+0

고맙습니다. 나는 그것이 프로 시저가 아닌 함수 여야한다고 믿는 것을 제외하고는 다음과 같습니다. my_date_add (d DATE, i VARCHAR (45))는 날짜를 – edward

+0

반환합니다. 도움이 되었기 때문에 기쁩니다. 아마도 맞을 수도 있습니다. 아마도 함수가 더 적절할 것입니다. 나는 그것이 결국 차이를 만들지 모르겠지만 그것이 의미가 있습니다. –

관련 문제