【问题标题】:MySQL str_to_date not converting dates properlyMySQL str_to_date 没有正确转换日期
【发布时间】:2015-12-15 18:31:26
【问题描述】:

我有以下 SQL(使用 MySQL 5.6.25 社区)为银行信息创建一个新表,然后从 CSV 文件加载它;但是,当我这样做时,“posted_date”字段设置为 NULL:

CREATE TABLE
IF NOT EXISTS account
(id INT PRIMARY KEY AUTO_INCREMENT, 
post_date DATE,
reference_num DECIMAL(24,0),
payee TEXT,
address TEXT,
amount DECIMAL(30,2));

LOAD DATA LOCAL
INFILE '/Users/tkessler/Data/banking.csv'
INTO TABLE account
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(post_date, reference_num, payee, address, amount)
SET
    post_date = str_to_date(post_date, '%m/%d/%Y'),
    reference_num = cast(substring(reference_num,1,char_length(reference_num)) as DECIMAL(24,0)),
    payee = substring(payee, 2, char_length(payee)-2),
    address = substring(address,2,char_length(address)-2),
    amount = cast(substring(amount,1,char_length(amount)-2) as DECIMAL(30,2));

数据的几行示例如下:

04/15/2015,24393985105217960500072,"Company 1","Sacramento CA",-68.25
04/14/2015,24493985103247937700049,"Company 2","San Francisco CA",-10.00
04/14/2015,24592165103050851117121,"Company 3","Web Order",-24.99
04/13/2015,24792165102060610562563,"Company 4","Sacramento CA",-3.58
04/13/2015,24826385102370499124382,"Company 5","Sacramento CA",-29.81

当我运行 SQL 时,我将 post_date 设置为 NULL,但如果我将 post_date 数据类型更改为“文本”,那么它确实会显示来自 str_to_date() 函数的格式正确的日期字符串(例如,'2015- 04-15' 从这里的第一个示例数据行开始)。

如果我在 str_to_date() 函数中使用像“01/21/2000”这样的静态日期字符串而不是“post_date”变量,并且 post_date 数据类型是“日期”,那么问题就来了工作没有问题,所有导入的条目在 post_date 字段中都得到“2000-01-21”(格式化为所需的日期数据类型)。

我在这里感到困惑,因为静态日期字符串可以转换并正确实现,但即使动态日期变量似乎通过 str_to_date() 函数转换为格式正确的日期条目,MySQL 也无法识别它作为日期,并且传入 NULL。

我尝试使用 substring() 函数从正在转换的日期字符串中删除任何可能的不可见前导或尾随字符,但没有任何效果。据我所知,输入日期只是与静态日期字符串格式相同的基本文本,没有什么特别之处可能导致此问题。

【问题讨论】:

  • 格式如何?在您的 csv 文件中,您说它是 04/15/2015 但是当字段是文本时,您会得到 2015-04-15 ?
  • @fthiella,通过 str_to_date() 函数将 CSV 文件中的格式 MM/DD/YYYY 转换为 YYYY-MM-DD,这是“日期”数据类型应采用的格式接受。
  • MySQL 尝试在应用 str_to_date 函数之前隐式转换日期,当您调用此函数时 str_to_date(post_date, '%m/%d/%Y') post_date 不是字符串,而是已经是日期,并且已经为 null,因此无法转换.这就解释了为什么只有日期字段受到影响,但 Alexey 的解决方案是正确的。

标签: mysql sql


【解决方案1】:

如果要对字段进行后处理,则应使用临时变量,如下所示:

LOAD DATA LOCAL
INFILE '/Users/tkessler/Data/banking.csv'
INTO TABLE account
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(@post_date, reference_num, payee, address, amount)
SET
    post_date = str_to_date(@post_date, '%m/%d/%Y'),

【讨论】:

  • 啊!它的简单疏忽。谢谢!这解决了它。奇怪的是,它似乎只影响这一领域,而不是其他领域。
猜你喜欢
  • 2016-12-23
  • 1970-01-01
  • 2016-05-20
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
相关资源
最近更新 更多