【问题标题】:identify date format 09-08-2014识别日期格式 09-08-2014
【发布时间】:2014-08-08 12:37:57
【问题描述】:

我在 mysql 数据库中有超过 5000 条记录,其中日期以varchar 格式存储。

示例日期和格式

09-08-2014 dd-mm-yy 
4-2-2014 mm-dd-yy
2014-4-4 yy-mm-dd

如何识别每种日期格式并将其更改为通用格式?

我面临的问题是,当我运行查询以获取 dd-mm-yy 时,我也得到了与 mm-dd-yy 相同的值。

【问题讨论】:

  • 没有规则意味着没有算法。
  • 你在混用 dd-mm 和 mm-dd 是完全不行的
  • 您的日期不明确。可能是 9 月 8 日或 8 月 9 日。没有办法脱离上下文消除歧义。
  • 如果您知道数据的来源(我的意思是语言环境),您也许可以猜到。如果语言环境是美国,我猜它是 mm-dd-yy 而欧洲猜它是 dd-mm-yy。
  • 如果您没有明确定义每一行的格式,您无法说 4-2-2014 是 2014 年 2 月 4 日或 2014 年 4 月 2 日

标签: php mysql date datetime


【解决方案1】:

没有规则意味着没有算法。

你问的问题听起来像是一次性的工作,以获取合理的数据。

当您到达存储为 varchars 的日期时,许多事情可能会出错。你提到的那些和其他一些最糟糕的,比如根本没有约会,比如60/90/2014

但是,一个列的一般规则是它的内容是统一的,因此如果您有xx-yy-AAAA 形式的字符串,其中xx 大于12 或yy 大于,您可以使用一些查询进行调查大于 12 并且假设所有列共享相同的格式。

【讨论】:

    【解决方案2】:

    有一种方法,但不明确对于 dd 和 mm 值小于或等于 12 的 mm-dd-yy 和 dd-mm-yy 日期格式。

    创建表格并插入样本值:

    create table dates(
        stored_date varchar(20)
    );
    
    
    insert into dates (stored_date)
    values 
    ('09-08-2014'),
    ('4-2-2014'),
    ('2014-4-4');
    

    查询以提取每一行的日期值:

    select stored_date,  
    case 
      when date(stored_date) = stored_date then
        date(stored_date)
      when str_to_date(stored_date,'%d-%m-%Y') is not null then
        str_to_date(stored_date,'%d-%m-%Y')
      when str_to_date(stored_date,'%m-%d-%Y') is not null then
        str_to_date(stored_date,'%m-%d-%Y')
     else 
        null
     end as parsed_date
    from dates;
    

    结果:

    +-------------+-------------+
    | stored_date | parsed_date |
    +-------------+-------------+
    | 09-08-2014  | 2014-08-09  |
    | 4-2-2014    | 2014-02-04  |
    | 2014-4-4    | 2014-04-04  |
    +-------------+-------------+
    

    您需要手动过滤日期格式,但可能是一些行(不是 5000 条记录)

    【讨论】:

      【解决方案3】:

      感谢大家的帮助

      我通过正则表达式解决了这个问题,因为它是 varchar 格式。必须为所有可用格式生成正则表达式

      使用此正则表达式过滤 dd/mm/yy -REGEXP '[0-9]{2}/[0-9]{2}/[0-9]{4}';

      参考 http://www.tech-recipes.com/rx/484/use-regular-expressions-in-mysql-select-statements/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-17
        • 2015-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-26
        相关资源
        最近更新 更多