【问题标题】:MySQL convert ISO date to datetimeMySQL 将 ISO 日期转换为日期时间
【发布时间】:2020-03-17 13:43:02
【问题描述】:

我有一个包含 20,000,000 行的表,其中“时间”列保存为字符串 (type=TEXT),并包含 3 种不同形式的值:

  • 日期时间:2020-01-01 15:23:45
  • ISO 日期:2020-01-01T15:23:45.000Z

MySQL 有没有办法将所有 ISO 日期转换为正确的 DateTime 格式?当我尝试将它们强制转换为“日期时间”时,查询失败。当我尝试更改表时,查询失败。 当我尝试更改表时,我得到:

不正确的日期时间值:'2020-02-13T08:10:02.000Z' 用于第 668290 行的列“时间”

我知道我可以将数据库中的所有行查询为其他语言,在那里进行转换,然后逐行更新,我只是想确保没有一种简单的方法可以直接在SQL。

【问题讨论】:

  • .000Z 在所有(这些)行中始终保持一致吗?
  • @Martin 是的,是一致的

标签: mysql datetime


【解决方案1】:

因为.000Z 在所有相关行中都是一致的:

您可以运行以下查询:

UPDATE MyTable
SET `Time` = REPLACE (REPLACE (`Time`, 'T', ' '), '.000Z', '')
WHERE `Time` IS NOT NULL

此嵌套替换检查 TEXT 列的值,如果找到,则将它们替换为相应的空格或空白;

因此:

  • NULL 变为 NULL
  • 2020-01-01 15:23:45 变为 2020-01-01 15:23:45(没有发现要替换)
  • 2020-01-01T15:23:45.000Z 变为 2020-01-01 15:23:45

因此,ISO 变成了 DateTime 形状,然后您应该能够通过将列类型从 Text 更改为 DateTime 来轻松地将其转换。

MySQL Manaul - Replace

【讨论】:

    【解决方案2】:

    我认为这是一次性数据校正,因此不需要自动化,速度也不是考虑因素。

    鉴于此,我将首先更改表格,使字段长度为 19 个字符。这将从 ISO 日期戳记录中截断不需要的 .000Z 元素。

    在此之后,我将执行更新查询以将 T 字符替换为空格。它总是在同一个位置,所以是这样的:

    UPDATE mytable set myfield = CONCAT(SUBSTRING(myfield, 0, 10), ' ', SUBSTRING(myfield, 11, 8))
    

    这将更新所有记录,但正确的记录最终应该和原来一样。

    显然,首先在一个小样本数据集上运行它以确认它可以工作,然后再将它扔到您的主数据库中。如果数据库很大,可能需要一段时间才能运行。

    【讨论】:

    • 用字符串长度很好地调用以切断尾随 .000Z
    • 谢谢你的回答,这也是可以接受的,但另一种解决方案对我来说更直观。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2016-04-03
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多