【问题标题】:How to convert date string "yyyy-mm-ddThh:mm:ssZ" to timestamp如何将日期字符串“yyyy-mm-ddThh:mm:ssZ”转换为时间戳
【发布时间】:2022-01-08 23:53:04
【问题描述】:

我有一个带有时间戳的 CSV 文件,例如 2018-04-04T00:03:04Z。我创建了一个带有时间戳字段的表,并用 CSV 中的数据填充了该表,但生成了一个错误:

日期时间值不正确

我的桌子根本没有坐满;执行选择查询返回 0 行。

我尝试使用str_to_date(date_sale, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") ,但它返回空值。

之前我创建了带有日期字段作为字符串的表,一切正常,但现在我需要将此字段转换为时间戳字段以操作日期。我正在使用表格数据导入向导填充表格。

有人可以帮忙吗?

【问题讨论】:

  • Z 表示应包含时区信息。
  • 顺便说一句,永远不要将日期/时间数据存储在 varchar 列中。使用正确的日期/时间数据类型!
  • 您的列是 varchar 类型。你只需要修改它。 ALTER TABLE nf MODIFY date_sale timestamp。但是你需要在它之前格式化你的日期
  • @jarlh 我尝试用 CET 替换 Z 并再次应用 str_to_date,结果为空值。我已经尝试使用时间戳字段创建表,但无法使用 CSV 文件填充表。
  • 可以选择 PHP 吗?是否要将数据转换为当地时间?

标签: mysql sql datetime timestamp


【解决方案1】:

如果不需要转换为当地时间,您可以使用正确格式的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')

【讨论】:

    【解决方案2】:

    正如我一开始所说,您应该将日期更新为有效格式:

    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;
    

    在这一步之后你需要修改你的表:

    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中将数据操作为日期时间格式。

    例如,如果您在 DB 中有时间戳格式,则下一个查询不会将您的字符串 date_sale 与字符串 '2013-12-12' 进行比较:

    SELECT * FROM nf WHERE date_sale > '2013-12-12';
    

    【讨论】:

    • 我无法做到这一点,因为我正在使用帖子中所说的表数据导入向导。
    • @GabrielaBaldiviaSoncini 好的,对不起。我错过了
    • 没问题,还是谢谢你。
    【解决方案3】:

    您应该使用datetimetimestamp

    您可以尝试使用以下方法帮助自己:

    SET SESSION SQL_MODE='ALLOW_INVALID_DATES'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 2016-05-13
      • 2017-02-03
      • 1970-01-01
      • 2018-05-19
      • 2014-05-02
      • 1970-01-01
      相关资源
      最近更新 更多