如何将日期字符串 "yyyy-mm-ddThh:mm:ssZ" 转换为时间戳
How to convert date string "yyyy-mm-ddThh:mm:ssZ" to timestamp
我有一个带有时间戳的 CSV 文件,例如 2018-04-04T00:03:04Z
。我创建了一个带有时间戳字段的 table 并用来自 CSV 的数据填充 table,但生成了一个错误:
Incorrect datetime value
而我的 table 根本没有填满;执行 select 查询 returns 0 行。
我尝试使用 str_to_date(date_sale, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
但它返回了空值。
之前我创建了 table 并将日期字段作为字符串,一切正常,但现在我需要将此字段转换为时间戳字段以便操作日期。我正在使用 Table 数据导入向导.
填充 table
有人可以帮忙吗?
您应该使用 datetime
或 timestamp
。
您可以尝试使用以下方法帮助自己:
SET SESSION SQL_MODE='ALLOW_INVALID_DATES'
如果不需要转换为当地时间,您可以使用正确格式的 str_to_time
:
select str_to_date('2018-04-04T00:03:04Z', '%Y-%m-%dT%H:%i:%sZ')
-- 2018-04-04 00:03:04
如果需要时区转换,那么您必须确保 timezone related tables are setup correctly 然后使用 convert_tz
函数:
select convert_tz(str_to_date('2018-04-04T00:03:04Z', '%Y-%m-%dT%H:%i:%sZ'), 'zulu', 'system')
正如我一开始所说,您应该将日期更新为有效格式:
UPDATE nf
SET
date_delivery = DATE_FORMAT(
STR_TO_DATE(date_delivery, '%Y-%m-%dT%H:%i:%sZ'), '%Y-%m-%d %H:%I'
),
date_sale = DATE_FORMAT(
STR_TO_DATE(date_sale, '%Y-%m-%dT%H:%i:%sZ'), '%Y-%m-%d %H:%I'
)
WHERE 1;
完成此步骤后您需要修改 table:
ALTER TABLE nf
MODIFY date_sale TIMESTAMP,
MODIFY date_delivery TIMESTAMP;
插入数据时不要忘记格式化:
INSERT INTO nf (id, id_produt, id_category, date_sale, date_delivery)
VALUES
(31, 3, 4, STR_TO_DATE('2012-12-12T00:24Z', '%Y-%m-%dT%H:%i:%sZ'), STR_TO_DATE('2012-12-12T00:24:00Z', '%Y-%m-%dT%H:%iZ:%s')),
(44, 3, 4, STR_TO_DATE('2012-12-12T00:24Z', '%Y-%m-%dT%H:%i:%sZ'), STR_TO_DATE('2012-12-12T00:24:00Z', '%Y-%m-%dT%H:%iZ:%s'))
这种方式更好,因为您可以将数据作为 sql 中的日期时间格式进行操作。
例如,如果您在数据库中有时间戳格式,那么下一个查询不会将您的字符串 date_sale 与字符串 '2013-12-12' 进行比较:
SELECT * FROM nf WHERE date_sale > '2013-12-12';
我有一个带有时间戳的 CSV 文件,例如 2018-04-04T00:03:04Z
。我创建了一个带有时间戳字段的 table 并用来自 CSV 的数据填充 table,但生成了一个错误:
Incorrect datetime value
而我的 table 根本没有填满;执行 select 查询 returns 0 行。
我尝试使用 str_to_date(date_sale, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
但它返回了空值。
之前我创建了 table 并将日期字段作为字符串,一切正常,但现在我需要将此字段转换为时间戳字段以便操作日期。我正在使用 Table 数据导入向导.
填充 table有人可以帮忙吗?
您应该使用 datetime
或 timestamp
。
您可以尝试使用以下方法帮助自己:
SET SESSION SQL_MODE='ALLOW_INVALID_DATES'
如果不需要转换为当地时间,您可以使用正确格式的 str_to_time
:
select str_to_date('2018-04-04T00:03:04Z', '%Y-%m-%dT%H:%i:%sZ')
-- 2018-04-04 00:03:04
如果需要时区转换,那么您必须确保 timezone related tables are setup correctly 然后使用 convert_tz
函数:
select convert_tz(str_to_date('2018-04-04T00:03:04Z', '%Y-%m-%dT%H:%i:%sZ'), 'zulu', 'system')
正如我一开始所说,您应该将日期更新为有效格式:
UPDATE nf
SET
date_delivery = DATE_FORMAT(
STR_TO_DATE(date_delivery, '%Y-%m-%dT%H:%i:%sZ'), '%Y-%m-%d %H:%I'
),
date_sale = DATE_FORMAT(
STR_TO_DATE(date_sale, '%Y-%m-%dT%H:%i:%sZ'), '%Y-%m-%d %H:%I'
)
WHERE 1;
完成此步骤后您需要修改 table:
ALTER TABLE nf
MODIFY date_sale TIMESTAMP,
MODIFY date_delivery TIMESTAMP;
插入数据时不要忘记格式化:
INSERT INTO nf (id, id_produt, id_category, date_sale, date_delivery)
VALUES
(31, 3, 4, STR_TO_DATE('2012-12-12T00:24Z', '%Y-%m-%dT%H:%i:%sZ'), STR_TO_DATE('2012-12-12T00:24:00Z', '%Y-%m-%dT%H:%iZ:%s')),
(44, 3, 4, STR_TO_DATE('2012-12-12T00:24Z', '%Y-%m-%dT%H:%i:%sZ'), STR_TO_DATE('2012-12-12T00:24:00Z', '%Y-%m-%dT%H:%iZ:%s'))
这种方式更好,因为您可以将数据作为 sql 中的日期时间格式进行操作。
例如,如果您在数据库中有时间戳格式,那么下一个查询不会将您的字符串 date_sale 与字符串 '2013-12-12' 进行比较:
SELECT * FROM nf WHERE date_sale > '2013-12-12';