将null和格式不正确的datetime值导入datetime列MySQL

时间:2014-07-23 16:04:24

标签: mysql datetime sequelpro

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

此外,不了解SQL或数据库的人将会运行import语句,因此最好让他们只需单击文件 - 导入,而不必在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日期格式,然后执行我的日期函数。

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

2 个答案:

答案 0 :(得分:4)

使用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;

包含分隔符的字段的问题,在本例中是逗号,您已经解决了用封闭字符包围这些字段(或简称所有字段)。

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

答案 1 :(得分:0)

您问题的真实答案:

如果您有运行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中运行以下查询:更新your_table SET your_column = NULL,在your_column ='2099-01-01 00:00:00:00';