1

我正在尝试将一个日期和时间格式化为一个名为 DATE 的列中的 DD/MM/YYYY (Varchar) 和另一个名为 TIME 作为 HH:MM:SS 的列中的一个变量以插入到另一列中(在 Datetime 数据中类型)。下面的代码是我的程序。

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;

这似乎有效,并解释了可能最终出现在我的原始日期列中的任何可变日期。

4

2 回答 2

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(即在需要时仅使用两位数),那么您将无法使用固定的子字符串位置。

于 2013-02-27T09:39:25.413 回答
1

不知何故,您的 LMONTH 和 LDAY 值似乎被颠倒了,因为 LMONTH 被写为 31 而 LDAY 被写为 01 - 这显然是不正确的。检查源表中的数据。

于 2013-02-27T09:39:33.210 回答