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

标签 mysql sql regex string date

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

September 2008 – March 2010 

May 2015 – Present

2007 – 2008

July, 1995 – March, 1997

July, 1995 – Current

是的,它非常丑陋。展望 future ,我想将它们分成两列,开始日期和结束日期,以便可以动态创建信息。我能找到的唯一一致的模式是所有开始日期都包含年份,所有结束日期都包含年份或表明范围仍在增长。另一种模式是每个日期都可以按“-”模式拆分。如果有一种简单的方法来提取月份,我很乐意研究它,但月份对于此目的并不重要,因此提取年份的答案绰绰有余。

最佳答案

这是一种方法:

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' 值,您可能需要额外的逻辑。

关于mysql - 在 MySQL 中,如何从一列输入不一致的日期中提取年份作为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44029417/

相关文章:

php mysql 插入更新查询在本地工作但在服务器上不起作用

mysql - 仅在美国客户名称中首字母大写

mysql - 更新突变时返回 null GraphQL 和 Sequelize

mysql - 具有许多 "exception"列的大表

sql - 自动运行 ELMAH 数据库脚本

javascript - 使用 Javascript 正则表达式避免回溯

sql - 需要 MySQL 中的 REGEXP 匹配

sql - SELECT set of most recent id, amount FROM table,其中id出现多次

regex - 捕获匹配组的子字符串

python - 匹配所有包含的正则表达式 ''(2 个单引号)