2013-02-27 5 views
1

DATE는 DD/MM/YYYY (Varchar)라는 한 열과 HIME : MM : SS라는 TIME이라는 다른 열에서 하나의 변수로 오는 날짜와 시간을 형식화하려고합니다. (Datetime 데이터 형식의) 다른 열에 삽입하십시오. 아래 코드는 내 절차입니다. 난 단지 db.test_table 한 행이오류 코드 1292 Mysql DateTime

Call TESTProc; Error Code: 1292. Incorrect datetime value: '2013-31-01 16:00:40' for column 'LDATETIME' at row 2 

: 나는 프로 시저를 실행하면

DROP PROCEDURE IF EXISTS TESTProc; 

DELIMITER // 



CREATE PROCEDURE TESTproc() 

BEGIN 

DECLARE LYEAR VARCHAR(45); 

DECLARE LMONTH VARCHAR(45); 

DECLARE LDAY VARCHAR(45); 

DECLARE LTIME VARCHAR(45); 

DECLARE LDATETIME DATETIME; 

SELECT TIME FROM db.test_table INTO LTIME; 

SELECT SUBSTRING(DATE,6,4) FROM db.test_table INTO LYEAR; 

SELECT SUBSTRING(DATE,3,2) FROM db.test_table INTO LMONTH; 

SELECT SUBSTRING(DATE,1,1) FROM db.test_table INTO LDAY; 

SELECT CONCAT(LYEAR,'-', LMONTH,'-','0',LDAY,' ',LTIME) INTO LDATETIME; 

INSERT INTO db.test_table(VC19) VALUES (LDATETIME); 


END // 

Call TESTProc; 

, 나는 다시 에러 코드를 얻을. 테이블에 'LDATETIME'이라는 열이 없습니다. 이것은 내 로컬 변수입니다. 내 형식이 DateTime 'YYYY-MM-DD HH : MM : SS'에 대해 올바르다는 오류를 확인할 수 있습니다.

왜이 오류가 발생합니까?

업데이트 : 여기 내 코드는 지금 모습입니다 :

DROP PROCEDURE IF EXISTS DateProc; 

DELIMITER // 



CREATE PROCEDURE Dateproc() 

BEGIN 

DECLARE LTIME VARCHAR(45); 

DECLARE LDATE VARCHAR(45); 

DECLARE LDATETIME DATETIME; 

SELECT TIME FROM db.date_table INTO LTIME; 

SELECT DATE FROM db.date_table INTO LDATE; 


IF LENGTH(LDATE) = 9 AND SUBSTRING(LDATE,2,1) = '/' 
THEN SET LDATETIME = CONCAT(SUBSTRING(LDATE,6,4),'-0',SUBSTRING(LDATE,1,1),'-',SUBSTRING(LDATE,3,2), ' ', LTIME); 

ELSE IF LENGTH(LDATE) = 9 AND SUBSTRING(LDATE,3,1) = '/' 
THEN SET LDATETIME = CONCAT(SUBSTRING(LDATE,6,4),'-',SUBSTRING(LDATE,1,2),'-0',SUBSTRING(LDATE,4,1), ' ', LTIME); 

ELSE IF LENGTH(LDATE) = 10 
THEN SET LDATETIME = CONCAT(SUBSTRING(LDATE,7,4),'-',SUBSTRING(LDATE,1,2),'-',SUBSTRING(LDATE,4,2), ' ', LTIME); 

ELSE IF LENGTH(LDATE) = 8 
THEN SET LDATETIME = CONCAT(SUBSTRING(LDATE,5,4),'-0',SUBSTRING(LDATE,1,1),'-0',SUBSTRING(LDATE,3,1), ' ', LTIME); 

END IF; 

END IF; 

END IF; 

END IF; 


INSERT INTO db.date_table(table_name) VALUES (LDATETIME); 


END // 


CALL DateProc; 

이 작동하는 것 같다 내 원래 날짜 열을 끝낼 수있는 변수 날짜를 차지한다. 값에서

답변

2

봐 :하려고

'2013-31-01 16:00:40' 

가 사용하는 개월은 31 그것은 분명하지 않다

는 그냥 테스트 데이터가 잘못하거나 변경해야하는지 여부를 의미하는지 여부 이 라인 :

SELECT SUBSTRING(DATE,3,2) FROM db.test_table INTO LMONTH; 
SELECT SUBSTRING(DATE,1,1) FROM db.test_table INTO LDAY; 

에 :

SELECT SUBSTRING(DATE,1,2) FROM db.test_table INTO LMONTH; 
SELECT SUBSTRING(DATE,4,2) FROM db.test_table INTO LDAY; 

어쨌든 1에서 시작하는 하위 문자열에 대해 1에서 2로 변경되고 두 번째 시작 위치가 3에서 4로 변경된다는 점에 유의하십시오. 두 자리 숫자의 월 및 일 값이 필요합니까? 데이터 형식이 인 경우 실제로는 D/M/YYYY (즉, 필요할 때 두 자리 만 사용) 고정 부분 문자열 위치를 사용할 수 없습니다.

+0

@ user2006436 : 솔직히 말해서, 나는 노력해야 할 가치가 있습니다. 너는 월 너비가 변수가되기 때문에'/'로 나눌 필요가 있습니다 ... –

1

LMONTH가 31로 표시되고 LDAY가 01로 표시되는 것처럼 어쨌든 LMONTH와 LDAY 값이 반전 된 것 같습니다. 이는 분명히 부정확합니다. 소스 테이블 내의 데이터를 점검하십시오.