1

DATE という 1 つの列に含まれる日付と時刻を 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 には 1 行しかありません。「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 への変更と、2 番目の開始位置の 3 から 4 への変更に注意してください。2 桁の月と日の値が必要ですよね? データ形式が実際にD/M/YYYY である場合 (つまり、必要な場合に 2 桁のみを使用する場合)、固定の部分文字列位置を使用することはできません。

于 2013-02-27T09:39:25.413 に答える
1

LMONTH が 31 として、LDAY が 01 として書き込まれているため、LMONTH と LDAY の値が逆になっているように見えますが、これは明らかに正しくありません。ソース テーブル内のデータを確認します。

于 2013-02-27T09:39:33.210 に答える