【问题标题】:Import null and improperly formatted datetime values into datetime column MySQL将空值和格式不正确的日期时间值导入 MySQL 的日期时间列
【发布时间】:2014-07-23 16:04:23
【问题描述】:

我正在使用带有 Sequel Pro 界面的 MySQL 数据库,并且是 SQL 新手。我正在尝试从 csv 文件导入数据,而我要导入的列之一是 datetime 类型。但是,我接收数据的格式是 mm/dd/yy hh:mm AM/PM 或 null。最初,我将列的类型修改为 varchar 以避免该问题,但现在我需要对数据执行一些日期函数,除非该列具有日期时间类型和格式,否则无法完成,所以我需要一种方法将传入的数据转换为正确的日期时间格式。

此外,不了解 SQL 或数据库的人将运行导入语句,因此最好让他们简单地单击文件 -- 导入,而不必在 mysql 命令行中输入任何复杂的内容。此外,在运行查询后,我需要以相同的格式导出数据(mm/dd/yy hh:mm AM/PM 或 null)。

以下是该列的一些示例值:

Completion Time
null
6/16/14 10:33 AM
null
null
6/16/14 13:03 PM
6/17/14 13:53 PM
6/18/14 14:38 PM
6/18/14 14:52 PM
6/19/14 13:13 PM
6/18/14 18:56 PM
6/18/14 19:02 PM
null

我收集的一个可能简单的解决方案可能不是一个好主意,从几个小时的谷歌搜索来看,将列类型保持为 varchar 然后以某种方式仅提取传入的 mm/dd/yy 部分数据,将其转换为正确的 MySQL 日期格式,然后执行我的日期函数。

无论如何,任何帮助将不胜感激。

【问题讨论】:

  • 您必须转换传入日期,因为它不是 mysql 的正确可解析格式。它不能可靠地分辨出哪个部分是 mm,哪个是 dd。稍后可以使用此dev.mysql.com/doc/refman/5.5/en/… 重新转换输出
  • 有没有办法设置存储过程或触发器来转换传入的日期?

标签: mysql datetime sequelpro


【解决方案1】:

这对于 MySQL 的日期和时间函数来说并不难。 STR_TO_DATE 做你需要的导入:

我接收数据的格式是 mm/dd/yy hh:mm AM/PM 或 null。

您可以通过

获得您的 DATETIME 值
STR_TO_DATE(yourValue, '%m/%d/%y %h:%i %p')

您可以在函数 DATE_FORMAT 的描述中找到 STR_TO_DATE 的说明符

对于导出,您可以使用已经提到的函数 DATE_FORMAT 进行反向操作,并使用完全相同的格式字符串:

SELECT DATE_FORMAT(your_datetime_col, '%m/%d/%y %h:%i %p')

看看这个Demo

您可以像这样在 INSERT 语句中进行转换:

INSERT INTO example (date_time) VALUES 
(STR_TO_DATE('09/26/14 07:30 AM', '%m/%d/%y %h:%i %p'));

在更新后的Demo 中查看它的工作情况

使用 LOAD DATA INFILE 自定义导入

让我们有一个表example 有两列iddate_time 作为

CREATE TABLE example (
    id INT NOT NULL PRIMARY KEY,
    date_time DATETIME
);

我们还有一个 CSV 文件 example.csv,其中包含如下数据:

id,date
1,09/26/14 07:30 AM
2,07/23/14 07:30 PM

要使用 LOAD DATA INFILE 导入此文件,您将使用以下语句:

LOAD DATA INFILE 'path/on/server/to/example.csv'
INTO TABLE example
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES             -- because of the column headers in the first line
(id, @var1)                -- You've got to map every field of your csv file to a column
                           -- of your table.
                           -- You've got to list the names of the columns of your table,
                           -- not the headers in the csv file.
                           -- if one field should be ignored, use another variable for this
                           -- field.
SET date_time = STR_TO_DATE(@var1, '%m/%d/%y %h:%i %p');

如果 csv 文件中的日期包含表示 NULL 值的文字字符串“null”,则使用 CASE 运算符:

date
09/26/14 07:30 AM
null
07/23/14 07:30 PM

那么我们必须使用

LOAD DATA INFILE 'path/on/server/to/example.csv'
INTO TABLE example
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n' -- your line endings
IGNORE 1 LINES             -- because of the column headers in the first line
(@var1)                     -- read all parts of the date in variables
SET completionTime = CASE 
                     WHEN @var1 = 'null' THEN NULL 
                     ELSE STR_TO_DATE(@var1, '%m/%d/%y %h:%i %p')
                     END;

包含分隔符的字段的问题,在本例中为逗号,您已经通过用封闭字符将这些字段(或全部)括起来解决了。

但我们真的应该看看你的真实格式。

【讨论】:

  • 我的字段没有用引号括起来,我在评论中更改了字段名称以实现匿名,如您所说。问题是 datetime 列完全为空,并且其他列的数据全部混乱,其中 datetime 列中的某些字符出现在其他列中,替换了实际存在的数据,然后它们的数据被移动到一列
  • @djar 由于您的日期列是第一个,您能否给我一两行日期(应该没有问题)和来自第二个字段的匿名数据。很显然,这时候就搞砸了。如果它适用于日期列和第一个字段,那么其余的应该不是什么大问题。
  • @djar 听起来有点像你的数据中的逗号弄乱了映射
  • @MichaelMcGriff 这也是我所怀疑的。在10\20\14, 08:12 AM 或类似的行中。
  • @MichaelMcGriff 谢谢我没有注意到,你是对的。但是现在为什么我的日期时间列仍然只包含空值?
【解决方案2】:

您问题的真正答案:

如果您有非技术人员运行 Sequel Pro 导入并需要数据处理,那么您需要编写和导入/导出脚本,用户可以从中上传和下载 Excel 工作表。

但是...

我在使用 Sequel Pro 导入日期时遇到了类似的问题。所以这是一个“一半”的解决方案。从它那里得到你想要的。

(注意:这个问题是 5 年前提出的,所以这是为了任何遇到这个问题并遇到类似 Sequel Pro 问题的人的利益。)

这是一个“一半”的解决方案:

首先在 Excel 中重新格式化 DateTime。

  1. 选择列
  2. 转到格式 > 单元格
  3. 选择“自定义”
  4. 类型使用“yyyy-mm-dd hh:mm:ss”
  5. 对于“空”值,请输入明显错误的日期,例如“2099-01-01 00:00:00:00”。

导入 Sequel Pro。

  1. 打开 Sequel Pro
  2. 转到查看 > 显示控制台(执行此操作以避免 Sequel Pro CSV 导入崩溃)
  3. 打开您的数据库连接并选择表。
  4. 导入 CSV。
  5. 注意发生的任何错误

在导入后清理您的数据。 (我告诉过你这是一个一半的解决方案)

  1. 在 Sequel Pro 中运行以下查询:UPDATE your_table SET your_column = NULL WHERE your_column = '2099-01-01 00:00:00:00';

【讨论】:

    猜你喜欢
    • 2014-06-28
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2023-04-02
    • 2014-06-29
    • 1970-01-01
    • 2017-12-10
    • 2017-07-18
    相关资源
    最近更新 更多