将数据迁移到新数据库,并希望从正确的备注开始。以前的开发人员允许用户手动输入日期范围,并将所有内容作为字符串存储在一列中。格式包括(但不限于):
September 2008 – March 2010
May 2015 – Present
2007 – 2008
July, 1995 – March, 1997
July, 1995 – Current
是的,这很难看。接下来,我想将它们分成两列,一个是startDate和endDate,这样就可以动态创建信息。我能找到的唯一一致模式是所有startDates包括年份,所有endDates包括年份或表明范围仍在增长。另一种模式是每个日期可以以' - '模式分割。如果有一个简单的方法来提取月份,我很乐意调查它,但是这几个月对于这个目的并不重要,所以提取年份的答案绰绰有余。
答案 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或客户端程序查看每条记录,根据您最常见的内容对原始格式进行分类,根据分类进行最佳转换,并使用转换后的值和状态更新记录。
完成后,您可以手动处理剩余数据,以获得无法自动执行的操作。一旦所有列都已转换,您就可以将数据推送到最终表,并可以删除转换表。