【问题标题】:Mysql - How to convert date from ISO 8601 format and save to mysql column?Mysql - 如何将日期从 ISO 8601 格式转换并保存到 mysql 列?
【发布时间】:2013-10-21 20:15:56
【问题描述】:

我在表 (varchar) 中有一个列,其中日期采用这种格式 2013-09-05T10:10:02Z

如何使用更新查询将其转换为日期时间格式并将其保存在另一列中?

【问题讨论】:

    标签: mysql datetime


    【解决方案1】:

    你可以使用STR_TO_DATE函数:

    UPDATE table1 SET col2 = STR_TO_DATE(col1,'%Y-%m-%dT%TZ')
    

    例子:

    mysql> select STR_TO_DATE('2013-09-05T10:10:02Z','%Y-%m-%dT%TZ');
    +----------------------------------------------------+
    | STR_TO_DATE('2013-09-05T10:10:02Z','%Y-%m-%dT%TZ') |
    +----------------------------------------------------+
    | 2013-09-05 10:10:02                                |
    +----------------------------------------------------+
    1 row in set (0.00 sec)
    

    【讨论】:

    • 这也会解决时区问题吗?
    • 对于任何希望对包含微秒的 ISO 日期时间字符串执行相同操作的人,微秒的说明符是 %f,因此格式是 '%Y-%m-%dT%T.%fZ'。供参考:dev.mysql.com/doc/refman/8.0/en/…
    【解决方案2】:

    您也可以使用CAST('2013-09-05T10:10:02Z' AS DATETIME),它不需要像STR_TO_DATE() 中的格式定义。

    【讨论】:

    • 执行这个我收到:Error: Truncated incorrect datetime value: '2011-10-02T23:25:42Z'.
    • 你的 MySQL 版本是多少?
    • 我不能代表@jengeb,但我使用CAST() 得到了他们的same 错误Error: Trucated…。我使用的是 mySQL 版本 8.0.20。
    【解决方案3】:

    如果您想处理时区,只需使用此查询,并使用 mysql 时区

    mysql> select CONVERT_TZ("2013-09-05T10:10:02Z", "+00:00", @@session.time_zone);
    
    +-------------------------------------------------------------------+
    | CONVERT_TZ("2013-09-05T10:10:02Z", "+00:00", @@session.time_zone) |
    +-------------------------------------------------------------------+
    | 2013-09-05 12:10:02                                               |
    +-------------------------------------------------------------------+
    1 row in set, 1 warning (0.00 sec)
    

    或任何其他时区

    mysql> select CONVERT_TZ("2013-09-05T10:10:02Z", "+00:00", "+03:00");
    +--------------------------------------------------------+
    | CONVERT_TZ("2013-09-05T10:10:02Z", "+00:00", "+03:00") |
    +--------------------------------------------------------+
    | 2013-09-05 13:10:02                                    |
    +--------------------------------------------------------+
    1 row in set, 1 warning (0.00 sec)
    

    【讨论】:

      【解决方案4】:

      我尝试使用上面的 cast 方法,但会得到 cmets 中描述的截断错误。

      您也可以使用 CAST('2013-09-05T10:10:02Z' AS DATETIME),它不需要像 STR_TO_DATE() 中那样的格式定义。

      我会一直得到:Error: Truncated incorrect datetime value: '2011-10-02T23:25:42Z'

      在我的查询中使用它之前,我通过将值转换为 @ 变量来修复它。这是存储过程中的一个示例:

      CREATE PROCEDURE `new_procedure`(IN p_date VARCHAR(50), p_text VARCHAR(500))
      BEGIN
      
      SET @datestring = CAST(p_date AS DATETIME);
      
      -- used for debugging
      SELECT @datestring, p_text;
      
      INSERT INTO testtable(timestamp, text) VALUES(@datestring, p_text);
      
      END
      

      【讨论】:

        猜你喜欢
        • 2022-10-15
        • 1970-01-01
        • 2019-09-07
        • 2012-03-08
        • 1970-01-01
        • 2021-07-29
        • 2017-06-10
        • 2015-02-07
        • 2012-05-28
        相关资源
        最近更新 更多