【问题标题】:Homogenize a field with different date formats in Mysql同质化Mysql中不同日期格式的字段
【发布时间】:2018-06-29 17:31:17
【问题描述】:

我正在使用 Mysql 工作台。

我有一个巨大的 csv 数据库,其中包含 3 列具有不同日期格式的内容。 为了能够将此 csv 文件加载到我的数据库中,我必须将 3 个日期列设置为文本,否则无法正确上传它们。 这是我的数据示例:

inDate,                   outDAte
19-01-10,                 02-02-10
04-01-11 12:02,           2011-01-11 11:31
29-01-11 6:57,            29-03-2010
30-03-10,                 01-04-2010
2012-12-03 05:39:27.040,  12-12-12 17:04
2012-12-04 13:47:01.040,  29-11-12

我想将它们同质化并制作 2 列,其中每一列仅带有“日期”,而另一列仅带有“时间”。

我尝试过使用“正则表达式”和“大小写”。
当我使用“reg 表达式”时给了我空值,而使用“case”时给了我“截断的错误值”。

我试图在网上找到类似的情况。我发现人们遇到了类似的问题,但有两种日期格式,不像我有那么多不同的格式:

我真的很陌生,我不知道如何在mysql中编写这么多异常。

【问题讨论】:

  • 02-02-10 是 2002 年吗?还是在 2010 年?也就是模棱两可的值该怎么办?
  • 是的!这也很棘手!幸运的是,我知道数据跨度是从 2010 年到 2012 年。否则没有机会知道它:(
  • 那么10-11-12是什么日期?

标签: mysql regex case


【解决方案1】:

将 CSV 加载到临时表中;按摩该表中的值;最后复制到“真实”表中。

每个日期在该表中有 2 列;一个用于来自 CSV 的原始值;另一个是DATETIME(3)(或任何经过消毒的版本)。

为每种截然不同的格式执行以下操作:

UPDATE tmp SET inDate = ...
           WHERE raw_inDate REGEXP '...';

WHERE 可能需要 AND LENGTH(inDate) = 8 之类的东西以及除 REGEXP 之外的其他测试方式。

SUBSTRING_INDEX(inDate, '-', ...) 可能是一个方便的日期分割功能。

但是,实际上,我宁愿用 Perl 或其他一些真正的编程语言编写代码。

【讨论】:

  • 我已经尝试过了:UPDATE datesDif SET inDate = (CASE WHEN CHAR_LENGTH(inDate) = 8 THEN STR_TO_DATE(inDate,'%Y-%m-%d') ELSE STR_TO_DATE(inDate,' %Y-%m-%d %H:%i:%s') END); # 给出错误代码 1411 不正确的 dateme 值
  • 和这个 UPDATE datesDif 设置 inDate = (CASE WHEN SUBSTRING(@inDate, 1, 10) REGEXP '^([0-9]{2}.[0-9]{2}.[ 0-9]{2})$' THEN STR_TO_DATE(SUBSTRING(@inDate, 1, 10), '%d.%m.%Y') WHEN SUBSTRING(@inDate, 1, 10) REGEXP '^([0 -9]{4}-[0-9]{2}-[0-9]{2})$' THEN DATE(@inDate) ELSE NULL END); # 没有错误但给出空值
  • 没有。为日期的每个模式执行单独的UPDATE 语句。不要试图建立一个大混乱CASE。您的样本似乎遵循大约 6 种模式。也许你有更多?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 2019-11-20
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 2020-07-25
相关资源
最近更新 更多