【问题标题】:Why do I get a '1292 Truncated' warning when importing a CSV with time data to MySQL?将带有时间数据的 CSV 导入 MySQL 时,为什么会收到“1292 截断”警告?
【发布时间】:2017-01-22 13:59:08
【问题描述】:

我正在将一个 csv 文件导入 MySQL。部分数据是时间字段。我正在使用TIME_FORMAT() 来设置期望格式。但是,我没有得到我需要的东西。这是我用来格式化时间字段的代码。

CREATE TABLE `COURSE_SECTION` (
    `C_SEC_ID` INTEGER PRIMARY KEY AUTO_INCREMENT,
    `COURSE_ID` INTEGER NOT NULL,
    `TERM_ID` INTEGER NOT NULL,
    `SEC_NUM` INTEGER NOT NULL,
    `F_ID` INTEGER NOT NULL,
    `MTG_DAYS` VARCHAR(7) NOT NULL,
    `START_TIME` TIME NOT NULL,
    `END_TIME` TIME NOT NULL,
    `LOC_ID` INTEGER,
    `MAX_ENRL` INTEGER,
FOREIGN KEY (`COURSE_ID`)
    REFERENCES course (`COURSE_ID`)
    ON UPDATE CASCADE 
    ON DELETE NO ACTION,
FOREIGN KEY (`TERM_ID`)
    REFERENCES term (`TERM_ID`)
    ON UPDATE CASCADE 
    ON DELETE NO ACTION,
FOREIGN KEY (`F_ID`)
    REFERENCES faculty (`F_ID`)
    ON UPDATE CASCADE 
    ON DELETE NO ACTION,
FOREIGN KEY (`LOC_ID`)
    REFERENCES location (`LOC_ID`)
    ON UPDATE CASCADE 
    ON DELETE NO ACTION
);

csv 输入:

C_SEC_ID, COURSE_ID, TERM_ID, SEC_NUM, F_ID,    MTG_DAYS, START_TIME, END_TIME, LOC_ID, MAX_ENRL
Number,   Number,    Number,  Number,  Number,  String,   Date/Time,  String,   Number, Number
1,        1,         4,       1,       2,       MWF,      10:00 AM,   10:50 AM, 1,      140
2,1,4,2,3,TR,9:30 AM,10:45 AM,7,35
3,1,4,3,3,MWF,8:00 AM,8:50 AM,2,35
4,2,4,1,4,TR,11:00 AM,12:15 AM,6,35
5,2,5,2,4,TR,2:00 PM,3:15 PM,6,35
6,3,5,1,1,MWF,9:00 AM,9:50 AM,5,30
7,3,5,2,1,MWF,10:00 AM,10:50 AM,5,30
8,4,5,1,5,TR,8:00 AM,9:15 AM,3,35
9,5,5,1,2,MWF,2:00 PM,2:50 PM,5,35
10,5,5,2,2,MWF,3:00 PM,3:50 PM,5,35
11,1,6,1,1,MTWRF,8:00 AM,9:30 AM,1,50
12,2,6,1,2,MTWRF,8:00 AM,9:30 AM,6,35
13,3,6,1,3,MTWRF,8:00 AM,9:30 AM,5,35

导入 csv 的代码:

LOAD DATA LOCAL INFILE 'path to the file/Course_Section.csv' 
INTO TABLE COURSE_SECTION
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 2 ROWS
(C_SEC_ID,COURSE_ID,TERM_ID,SEC_NUM,F_ID,MTG_DAYS,@START_TIME,@END_TIME,LOC_ID,MAX_ENRL)
SET START_TIME = TIME_FORMAT(@START_TIME, '%h:%i %p'),
END_TIME = TIME_FORMAT(@END_TIME, '%h:%i %p');

表格中的结果是03:15:00 而不是03:15 PM

我也尝试了以下代码,但没有成功:

SET START_TIME = TIME_FORMAT(CAST(@START_TIME AS CHAR CHARACTER SET utf8), '%h:%i %p'),
END_TIME = TIME_FORMAT(CAST(@END_TIME AS CHAR CHARACTER SET utf8), '%h:%i %p');

结果和以前一样。

使用以下代码,我得到了正确的值,但有警告:

SET START_TIME = TIME_FORMAT(
    CAST(
        CONCAT(CASE WHEN RIGHT(@START_TIME,2) = 'PM' 
            THEN
                HOUR(@START_TIME) + 12 
            ELSE 
                HOUR(@START_TIME) END, ':',
                MINUTE(@START_TIME)) AS CHAR CHARACTER SET utf8), '%T'),

警告如下:

1292 Truncated incorrect time value: '10:00 AM'

该警告的确切含义是什么,以及如何摆脱它?

我的代码中缺少什么?

【问题讨论】:

  • 您的实际问题是什么?你能分享完整的样本输入数据吗?导入有什么问题?
  • 另外,请告诉我们您是如何得出“表格中的结果”为 03:15:00 的结论的。

标签: mysql csv time-format


【解决方案1】:

请试试这个

TIME_FORMAT(@END_TIME, '%r');

对于@START_TIME 也是如此,不使用任何自定义函数。也检查一下这个小提琴:

http://sqlfiddle.com/#!9/dcb16/59828

【讨论】:

  • mysql有自己的内置TIME_FORMAT函数来格式化时间部分
  • 我不是SELECT,我是LOAD DATA。我必须将您的建议修改为SET START_TIME = TIME_FORMAT(@START_TIME, '%r'), END_TIME = TIME_FORMAT(@END_TIME, '%r');。结果和以前一样……03:15:00 而不是03:15 PM 或 15:15:00`。
  • 可能有点远。我认为您可以只导入数据而 LOADATA 没有任何警告。然后使用 select into 语句使用 SELECT 语句将正确的数据插入到正确的表中,而不会发出警告以完成工作
猜你喜欢
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多