2013-02-27 42 views
1

我想格式化一個日期和時間,在一列稱爲DATE作爲DD/MM/YYYY(Varchar)和另一列稱爲時間爲HH:MM:SS到一個變量插入到另一列(在Datetime數據類型中)。下面的代碼是我的程序。錯誤代碼1292 Mysql的日期時間

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; 

當我運行過程中,我得到一個錯誤代碼回:

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

我只有一排db.test_table。我在表中沒有名爲'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:我不知道,說實話 - 值得一試。儘管如此,你還是需要用'/'來分割,因爲月份的寬度是可變的...... – 2013-02-27 10:22:22

1

不知怎麼,你的LMONTH和LDAY值似乎相反,因爲LMONTH被寫爲31,而LDAY被寫爲01--這顯然是不正確的。檢查源表中的數據。