在MySQL中,如何从一列不一致的日期中提取年份作为字符串?

时间:2017-05-17 15:43:47

标签: mysql sql regex string date

将数据迁移到新数据库,并希望从正确的备注开始。以前的开发人员允许用户手动输入日期范围,并将所有内容作为字符串存储在一列中。格式包括(但不限于):

September 2008 – March 2010 

May 2015 – Present

2007 – 2008

July, 1995 – March, 1997

July, 1995 – Current

是的,这很难看。接下来,我想将它们分成两列,一个是startDate和endDate,这样就可以动态创建信息。我能找到的唯一一致模式是所有startDates包括年份,所有endDates包括年份或表明范围仍在增长。另一种模式是每个日期可以以' - '模式分割。如果有一个简单的方法来提取月份,我很乐意调查它,但是这几个月对于这个目的并不重要,所以提取年份的答案绰绰有余。

2 个答案:

答案 0 :(得分:4)

这是一种方法:

select (case when substring_index(col, ' - ', 1) regexp '^[0-9]{4}$'
             then substring_index(col, ' - ', 1)
             when substring_index(col, ' - ', 1) regexp '[0-9]{4}$'
             then right(substring_index(col, ' - ', 1), 4)
             else 'Unknown'
        end) as startYear,
       (case when substring_index(col, ' - ', -1) regexp '^[0-9]{4}$'
             then substring_index(col, ' - ', -1)
             when substring_index(col, ' - ', -1) regexp '[0-9]{4}$'
             then right(substring_index(col, ' - ', -1), 4)
             when substring_index(col, ' - ', -1) like '%Current%' or
                  substring_index(col, ' - ', -1) like '%Present%'
             then date_format(now(), '%Y')
             else 'Unknown'
        end) as endYear

如果在结果列中找到'Unknown'值,则可能需要其他逻辑。

答案 1 :(得分:0)

问题是" 但不限于"声明。如果没有对可能的格式类型进行明确限制,您就无法进行全自动转换。

为了实现这一目标,我要做的是在新数据库中创建一个转换表,只包含您的键列,原始值,新的开始和结束日期列以及其他状态列。由于您无法完全自动化,因此请创建一个可以尽可能自动化的位置,并手动查看需要手动审核的内容。不要尝试在SQL语句中完成所有操作。使用过程SQL或客户端程序查看每条记录,根据您最常见的内容对原始格式进行分类,根据分类进行最佳转换,并使用转换后的值和状态更新记录。

完成后,您可以手动处理剩余数据,以获得无法自动执行的操作。一旦所有列都已转换,您就可以将数据推送到最终表,并可以删除转换表。