SQL中提取文本内可变长度日期的方法求助
解决SQL中提取可变长度mm/dd/yy日期的问题
首先要明确:SQL的PATINDEX不支持+、?这类正则表达式量词,它只认%(任意长度字符)、_(单个任意字符)、[](字符范围/集合)、[^](排除字符)这几种通配符。你之前写的[0-9]+里的+会被当成普通字符处理,[0-9+]是匹配0-9或者+符号,自然匹配不到日期格式。
给你两种可行的解决方法:
方法一:用PATINDEX匹配所有日期格式组合
因为要覆盖m/d/yy、mm/d/yy、m/dd/yy、mm/dd/yy四种情况,可以把这四种模式整合起来匹配,再根据匹配结果提取对应长度的字符:
SUBSTRING( [field1], -- 确定日期的起始位置 COALESCE( PATINDEX('%[0-9][0-9]/[0-9][0-9]/[0-9][0-9]%', [field1]), PATINDEX('%[0-9][0-9]/[0-9]/[0-9][0-9]%', [field1]), PATINDEX('%[0-9]/[0-9][0-9]/[0-9][0-9]%', [field1]), PATINDEX('%[0-9]/[0-9]/[0-9][0-9]%', [field1]) ), -- 确定要提取的字符长度 CASE WHEN PATINDEX('%[0-9][0-9]/[0-9][0-9]/[0-9][0-9]%', [field1]) > 0 THEN 8 WHEN PATINDEX('%[0-9][0-9]/[0-9]/[0-9][0-9]%', [field1]) > 0 OR PATINDEX('%[0-9]/[0-9][0-9]/[0-9][0-9]%', [field1]) > 0 THEN 7 ELSE 6 END )
方法二:用TRY_CONVERT直接转换(更简洁可靠)
SQL Server的CONVERT函数支持格式代码1(对应mm/dd/yy格式),它能自动识别一位或两位的月/日。先把字段内容转换成日期类型,再转回字符串就能得到标准格式:
SELECT TRY_CONVERT(varchar(8), TRY_CONVERT(date, [field1], 1), 1) AS extracted_date FROM your_table
如果field1里的内容不是有效日期,TRY_CONVERT会返回NULL,方便后续过滤无效数据。
内容的提问来源于stack exchange,提问作者Sam CD
相关产品推荐
相关产品推荐

