【问题标题】:mysql str_to_date returns NULL valuemysql str_to_date 返回 NULL 值
【发布时间】:2015-01-07 12:52:18
【问题描述】:

目标

我正在尝试将一个名为 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)
How to convert csv date format to into mysql db
(使用'SET column = str_to_date...')
MySql load data infile STR_TO_DATE returning blank?
(其他)
How to change string date to MySQL date format at time of import of CSV using MySQL's LOAD DATA LOCAL INFILE
Cannot transform mm/dd/yyyy in excel to csv yyyymmdd date format using SSIS
MySQL str_to_date produces NULL despite valid formatting

附加信息:

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

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

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

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

【问题讨论】:

    标签: mysql sql null load-data-infile str-to-date


    【解决方案1】:

    您正在使用“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'。在您的 cmets 之后,我不确定哪种日期格式是正确的,但@dob vs dob 变量问题肯定是真实的。您可能希望将 @dob 的每个实例替换为 @original_dob 之类的内容,以减轻未来的混乱。

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

    【讨论】:

    • 抱歉,我的日期格式是 M/D/YYYY,因为 xls 是 MM/DD/YYYY 但是当我将它保存到 .csv 时它会自动变为 M/D/YYY,所以我使用 %c/%e%Y
    • 你确定 %Y%m%d 在这里是正确的吗?根据您发送给我的 dev.mysql 支持页面,它说:“格式中的文字字符必须与 str 中的字面匹配。格式中的格式说明符必须与 str 中的日期或时间部分匹配。”所以我不应该写 %c% e%Y 因为那是“输入”的格式,@dob?列 dob,即 M/D/YYYY?。我想我已经看到它在 StackOverflow 页面上以两种方式编写。啊!我试过你的想法,它仍然返回 null
    • 我想我并不完全确定,但错误消息中的日期是我唯一的线索,它说“19850708”,即 YYYYMMDD。您实际上可以从 .csv 文件中发布一些行,包括带有一位数月份和日期的行吗?如果您确实有斜线,那么您将需要斜线,但是我不知道错误消息在哪里得到 1985 年的日期。
    • 好的,我看到了另一个问题,就是变量名。 @dob 变量名与“dob”列名混淆。我已经更新了我的答案,让我知道这个版本是否有效。抱歉,我之前错过了。
    • 我在第 4 行的列列表中添加了@dob,但这并没有帮助。我在我的 SELECT 语句中添加了@dob,因此它读取为SELECT firstname, lastname, @dob,现在每条记录的 dob 不再返回 null 或错误,而是 1992 年 4 月 7 日。在我的 .csv 文件中,第 4 条记录的出生日期是 4/7/1992。现在 csv 中的日期是 10/12/1999 3/11/1984 10/4/1987 和 4/7/1992
    猜你喜欢
    • 2017-03-16
    • 2017-05-26
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多