试图分析以各种方式和上下文输入的日期,这些日期可能存在于给定的记录中,也可能不存在
我可以使用选择候选行
SELECT * FROM table WHERE column REGEXP '[-|.|/][0-9][0-9][-|.|/]' ;
这确实会选择读取类似的记录
I was on top of mount Everest (2010-10-10)
i went to see the doctor on 13/12/10 and she told me I was in great shape.
其中第一和第二记录的匹配值分别为-10-和/12/。
现在,我想从列中提取日期。不仅是-10-或/12/,还有完整的日期片段2010-10-10或13/12/10,即匹配的表达式向后扩展到一个空格或一个括号,并在处向前扩展为括号的空格。
很抱歉,如果这是显而易见的-我不熟悉REGEX。
您必须找到日期输入的模式。您可以在where中使用regex,但需要以某种方式隔离它。它总是这本书的最后一部分吗?
既然你隔离了位置,你就可以做一个案例风格选择
选择案例当右(日期,4)在1900和2200之间时,右(日期:10)#mm/dd/yyyy当左(日期,4)在1900到2200之间时,则concantate(左(右(日期,5),2),"/",右(日期(2))结束日期
的那种折磨
编辑;;
SET@fieldName="我曾登上珠穆朗玛峰(2010-10-22)";
选择IF(STR_TO_DATE(凹入(RIGHT(SUBSTRING_INDEX(@fieldName,"-",1),4),'%Y-%m-%d')为NULL,
"错误日期",
"有效日期")
但现在,对于糟糕的日期和好的日期,您可以继续将该样式链接到日期的所有变体中。。。
尽管最好的解决方案是以特殊格式将该日期设置为diff-col(如果可以的话),因为它是输入
正确的REGEX(在这种情况下)是[0-9+-]+[-|.|/][0-9][0-][-|.|//]+[0-9+-][
你的模式[0-9+-]+[-./][0-9][0-9][-./]+[0-9+-]+
会匹配像+-+-.99///.///-++++
这样的东西,这真的是你想要的吗?
考虑使用
(?:(?P<year>d{3,4})|(d{1,2}))(?P<sep>[-./])d{1,2}(?P=sep)(?(year)d{1,2}|d{1,4})
相反。它不允许像1.2-2014
那样使用混合分隔符,也不允许像2010-10-2010
那样多个数字包含两个以上的数字。
演示。