【问题标题】:Date Time Conversion in MySQLMySQL中的日期时间转换
【发布时间】:2019-03-03 02:21:09
【问题描述】:

我将一个 CSV 文件导入 MySQL。 CSV 文件包含格式为'mm/dd/yyyy hh:mm' 的日期/时间。

它仅作为文本导入 MySQL。所以我确实将它作为文本导入。然后我创建了另一个字段,希望将此文本值转换为'mm-dd-yyyy hh:mm''YYYY-mm-dd hh:mm' 格式的日期时间。但它不起作用。下面是我的代码。

ALTER TABLE table1 ADD COLUMN StartDateNEW DATETIME;
SET SQL_SAFE_UPDATES = 0;
UPDATE table1 SET StartDateNEW = STR_TO_DATE(StartDate, '%m/%e/Y %H:%i');
SET SQL_SAFE_UPDATES = 1;

样本数据:

更多示例数据:

我已经尝试了一个多小时了。有人可以帮忙吗?

【问题讨论】:

  • 你可能想要'%m/%d/Y %H:%i'%d,而不是%e
  • 它也不适用于 %d。我使用 %e 是因为 %e 日期作为数值(0 到 31)和 %d 日期作为数值(01 到 31)。无论哪种方式,它都行不通。我都试过了。
  • 您是否使用LOAD DATA INFILE 语法加载数据?
  • 没有。这是我在使用 %c/%e/%Y %k:%I 时遇到的错误。
  • 错误代码:1411。日期时间值不正确:函数 str_to_date 0.000 秒的“3/31/2012 23:54”

标签: mysql sql date datetime sql-update


【解决方案1】:

如果您使用the LOAD DATA INFILE syntax 加载数据,应该可以即时处理转换。

假设您的源 csv 文件如下所示:

StartDate, EndDate, Value
"1/10/2012 10:05", "1/11/2012 11:51", abc
"1/13/2012 08:00", "1/15/2012 09:01", abc

您可以将列 StartDateEndDate 定义为 datetime 数据类型,并且只需执行以下操作:

LOAD DATA INFILE '/path/to/my/file.csv' INTO TABLE mytable
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\r\n' -- or '\n'
    IGNORE 1 LINES
    (@StartDate, @EndDate, Value)
    SET 
        StartDate = STR_TO_DATE(@StartDate, '%c/%e/%Y %k:%i'),
        EndDate =   STR_TO_DATE(@EndDate,   '%c/%e/%Y %k:%i')
;

注意:如果您目前不使用LOAD DATA INFILE... 我仍然建议您迁移代码以使用它。这是在 MySQL 中执行此操作的正确方法,它适用于所有客户端......而且速度非常快(参见 this link)。

【讨论】:

  • 我在 MySQL Workbench 中使用表导入向导。
  • @stat77:我建议使用LOAD DATA INFILE anway。这是在 MySQL 中执行此操作的正确方法,并且适用于所有客户端。
  • 我有一个 Excel CSV 文件。我应该修改代码的哪一部分以适应它?
  • @stat77:查看我在回答中给出的示例。在 SO 或网络上的其他地方有很多可用的资源,这些资源记录或展示了这个漂亮的 MySQL 功能如何工作的示例。
【解决方案2】:

根据您的示例数据,STR_TO_DATE 的正确格式字符串是

%c/%e/%Y %k:%i
  • %c 允许使用一位数的月份编号
  • %e 允许使用一位数的日期编号
  • %Y 四位数年份
  • %k 允许单位数小时
  • %i 两位数分钟

DATE_FORMAT 的手册中描述了所有格式字符串。

Demo on dbfiddle

【讨论】:

  • 即使使用 %c/%e/%Y 也会出错。错误代码:1411。日期时间值不正确:函数 str_to_date 0.000 秒的“3/31/2012 23:54”
  • @stat77 这是我在演示中使用的值...数据周围是否有多余的空格?
  • 这很奇怪。 2012 年 3 月 31 日晚上 11:54:00。我在 Excel LEN(3/31/2012 11:54:00 PM) 中使用 LEN 函数,它给了我 16 个字符。肯定超过 16 个字符。
  • @stat77 和 LEN('3/31/2012 23:54') 应该给出 15 而不是 16...
  • 日期和时间之间有两个空格。
【解决方案3】:

快速破解如下:

  1. 在 Excel 中打开 CSV 文件
  2. 选择日期列
  3. 使用单元格格式弹出窗口将日期格式更改为yyyy-mm-dd
  4. 保存文件
  5. 导入 MySQL

这是你不需要以文本形式导入然后尝试将数据转换为DateTime

【讨论】:

  • 谢谢,但我想保留时间。否则,我会这样做。
  • 我认为时间不会流失
  • 你是对的。时间不会显示在单元格中,但不会丢失。
猜你喜欢
  • 2017-06-07
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多