mysql - 将空值和格式不正确的日期时间值导入日期时间列 MySQL

标签 mysql datetime sequelpro

我正在使用带有 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 的日期和时间函数来说并不难。 STR_TO_DATE执行导入所需的操作:

the format I receive the data in is mm/dd/yy hh:mm AM/PM or 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;

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

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

关于mysql - 将空值和格式不正确的日期时间值导入日期时间列 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24915498/

相关文章:

android - 如何使用 Joda DateTime 显示荷兰月份

mysql - 续集专业版 : How to change a string to a date during import?

PHP 值未插入 MySQL 表

c# - 应用程序在重新启动之前看不到系统时区更改

java - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Communications link failure

python - 如何在Python中将 '%Y:%m:%d'转换为日期?

MySQL 说 : Host '10.10.10.121' is not allowed to connect to this MySQL server

php - 从 Laravel vagrant box 连接到 MySQL

MYSQL触发器仅在运行至少两次后更新

mysql - 使用键/值对从表中过滤和分组数据