SQL Server 2012中提取字符串年份并获取最大年份
在SQL Server 2012中提取字符串所有4位年份并取最大值
SQL Server 2012没有内置的正则拆分或多匹配函数,所以我们可以用递归CTE来遍历字符串,逐个提取所有4位数字,再筛选合法年份后取最大值。
实现代码
WITH YearCTE AS ( -- 初始步骤:提取第一个4位数字的位置和内容 SELECT YourValue, PATINDEX('%[0-9][0-9][0-9][0-9]%', YourValue) AS StartPos, SUBSTRING(YourValue, PATINDEX('%[0-9][0-9][0-9][0-9]%', YourValue), 4) AS YearStr FROM YourTable WHERE PATINDEX('%[0-9][0-9][0-9][0-9]%', YourValue) > 0 UNION ALL -- 递归步骤:从已提取年份的下一个位置继续查找下一个4位数字 SELECT y.YourValue, -- 计算下一个4位数字的起始位置 PATINDEX('%[0-9][0-9][0-9][0-9]%', SUBSTRING(y.YourValue, c.StartPos + 4, LEN(y.YourValue))) + c.StartPos + 3 AS StartPos, SUBSTRING(y.YourValue, PATINDEX('%[0-9][0-9][0-9][0-9]%', SUBSTRING(y.YourValue, c.StartPos + 4, LEN(y.YourValue))) + c.StartPos + 3, 4) AS YearStr FROM YourTable y JOIN YearCTE c ON y.YourValue = c.YourValue -- 仅当剩余字符串中还有4位数字时继续递归 WHERE PATINDEX('%[0-9][0-9][0-9][0-9]%', SUBSTRING(y.YourValue, c.StartPos + 4, LEN(y.YourValue))) > 0 ) -- 筛选合法年份(可根据需求调整范围),分组取每个字符串的最大年份 SELECT YourValue, MAX(CAST(YearStr AS INT)) AS MaxYear FROM YearCTE WHERE CAST(YearStr AS INT) BETWEEN 1900 AND 2100 GROUP BY YourValue;
测试示例
先创建测试表和数据:
CREATE TABLE YourTable (YourValue NVARCHAR(100)); INSERT INTO YourTable VALUES ('I started in 1998 and finished around 2012'), ('I was done in 2013 but started in 1997.'), ('No year here'), ('Year 2000 and 2050, also 1899');
运行上述CTE查询后,结果如下:
| YourValue | MaxYear |
|---|---|
| I started in 1998 and finished around 2012 | 2012 |
| I was done in 2013 but started in 1997. | 2013 |
| Year 2000 and 2050, also 1899 | 2050 |
说明
- 递归CTE会循环查找字符串中所有连续4位数字,直到没有匹配项为止;
- 加入年份范围筛选是为了排除
1234这类非年份的4位数字; - 如果字符串存在重叠的4位数字(比如
12345会提取1234和2345),可根据实际需求调整递归步长,但这种情况在年份场景中极少出现。
内容的提问来源于stack exchange,提问作者Soaps
相关产品推荐
相关产品推荐

