1

客观的

我正在尝试将一个名为 persondata 的 .csv 文件加载到 DB alldata TABLE persondata 中,然后对其运行名字、姓氏和出生日期 (dob) 的查询。.csv 中只有 4 条记录。
csv 中的日期格式为 MM/DD/YYYY,输出应为 YYYY/MM/DD、YYYY-MM-DD 或 YYYYMMDD。

SQL

LOAD DATA LOCAL INFILE 'C:/Users/john.smith/Desktop/persondata.csv'
INTO TABLE alldata.persondata
FIELDS TERMINATED BY ','
(firstname, lastname, dob, apptdate, icd9, cpt)
SET dob = str_to_date(@dob, '%c/%e/%Y')
;

SELECT firstname, lastname, dob
FROM alldata.persondata  

我收到的问题和错误消息

firstname 和 lastname 返回正确的值,但 dob 为所有 4 条记录返回 null。在 csv 文件中,前三列 (A, B, C) 是 firstname, lastname, dob。因此与表 persondata 中的顺序相同。

错误:

4 行受影响,8 个警告:1265 第 1 行的列“dob”的数据被截断 1411 日期时间值不正确:函数 str_to_date 1265 的“19850708”

我查阅的帮助页面:

(一般使用str_to_date)
如何将csv日期格式转换为mysql db
(使用'SET column = str_to_date ...')
MySql加载数据infile STR_TO_DATE返回空白?
(其他)
如何使用 MySQL 的 LOAD DATA LOCAL INFILE 在导入 CSV 时将字符串日期更改为 MySQL 日期格式
无法使用 SSIS 将 excel 中的 mm/dd/yyyy 转换为 csv yyyymmdd 日期格式
MySQL str_to_date 尽管格式有效,但仍会产生 NULL

附加信息:

我尝试了这个查询和它的一堆变体,但没有运气:

SET dob = date_format(str_to_date(@dob, '%c/%e/%Y'), '%Y/%c/%e')

我没有看到关于如何写这个的大量共识。有些人指定 %Y/%d/%m 的输出格式,有些人没有。但这不是 mysql 支持的唯一日期格式吗?这让我觉得我不应该写它。不确定这是否相关。我已经看到了整个事情的一些语法。我已经阅读了所有的支持页面,并且我认为我理解了“SET”命令。

*这是我在stackoverflow上的第一篇文章,所以请让我知道是否应该以不同的方式呈现

4

1 回答 1

0

您正在使用“dob”,您应该在列列表中使用“@dob”...第 4 行应该是:

(firstname, lastname, @dob, apptdate, icd9, cpt)
                      ^^^^

这是因为 mysql 将日期读入一个 VARIABLE(由 @ 表示),然后后面的 SET 命令操作该变量以匹配实际列(在没有 @ 的情况下正确识别 dob)。

另外,我认为当日期中似乎没有斜杠时,您会在字符串格式中使用斜杠。也就是说,错误表明日期是“19850708”(1985 年 7 月 8 日)。我相信你想要:

%Y%m%d

即,将第 5 行更改为:

SET dob = str_to_date(@dob, '%Y%m%d')

%m 和 %d 是两位数的月份和日期,例如,你需要它,因为你有 '07' 而不是 '7' 代表 7 月。在您发表评论后,我不确定哪种日期格式是正确的,但@dob vs dob 变量问题肯定是真实的。您可能想用类似@original_dob 的东西替换@dob 的每个实例,以减轻未来的混乱。

请参阅此页面: http ://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_str-to-date

于 2014-11-11T03:40:51.873 回答