【问题标题】:Convert from arbitrary dates to single date format从任意日期转换为单一日期格式
【发布时间】:2018-10-21 00:43:34
【问题描述】:

有人要求我将数据从一个表迁移到另一个表。旧数据包括以用户当时喜欢使用的任何格式混合输入的一系列日期,新格式需要在 MM/YYYY 中单独的 FROM 日期和 TO 日期字段。

因此,有些日期是单个日期,例如 DD.MM.YYYY 或 DD/MM/YY 或 DD YYYY 或 YYYY 或其他任何日期。有些日期是两个日期,例如 DD.MM.YYYY-DD/YYYY 或 DD/MM/YY--DD/MM/YYYY。所以只是一团糟。只有几百行,但如果可以避免的话,我不想手动更改它们。

Google 的大多数结果都是用于将一种格式转换为另一种格式,我如何才能将一堆格式转换为一种格式?

【问题讨论】:

  • 标准化可能需要大量工作。我会试着看看你能识别出多少种不同的模式。有些会很容易,有些会很难。有些必须手工完成。一旦您知道使用了哪些模式/格式,您就可以使用strtotime() 将其转换为诸如 unix 时间戳之类的合理内容,然后您可以稍后以您需要/想要的任何格式显示。 php.net/manual/en/function.strtotime.php
  • DD YYYY?真的吗?没有真正的方法可以知道06 11 12 是 11 月 6 日还是 6 月 11 日,甚至是别的什么。世界上没有任何代码可以解析人类可以组成的所有不同格式。
  • 在这种情况下,我的意思是 MM 而不是 DD。

标签: php mysql date


【解决方案1】:

使用一个表达式来包含所有组合很难,所以只需一个一个地做模式:

UPDATE olddata,newdata
SET newdata.date=STR_TO_DATE(olddate.date, "%d.%m.%Y")
WHERE olddata.id=newdata.id
  AND olddata.date REGEXP '[:digit:]{1,2}\.[:digit:]{1,2}.[:digit:]{4}'
  AND newdata.date IS NULL

对每种日期格式执行多次,并在STR_TO_DATE 中使用正确的表达式。在进行更新之前尝试使用正确的调节表达式进行选择。

最终你将有足够的记录来手动编辑

【讨论】:

  • 这是正确的答案。为所有特定添加转换,直到您几乎没有(或没有)手动操作 +++
  • 所以我没有使用 MYSQL,因为我没有足够的经验,所以我做了几乎你所说的,但在 PHP 中。
  • 应该提到测试正则表达式/str_to_date - SELECT date, STR_TO_DATE(date, "%d.%m.%Y") FROM olddata WHERE date REGEXP '[:digit:]{1,2}\.[:digit:]{1,2}.[:digit:]{4}' 以查看匹配/转换是否正常。
猜你喜欢
  • 1970-01-01
  • 2018-02-12
  • 2011-11-23
  • 1970-01-01
  • 2023-03-30
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 2016-12-02
相关资源
最近更新 更多