You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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查询后,结果如下:

YourValueMaxYear
I started in 1998 and finished around 20122012
I was done in 2013 but started in 1997.2013
Year 2000 and 2050, also 18992050

说明

  • 递归CTE会循环查找字符串中所有连续4位数字,直到没有匹配项为止;
  • 加入年份范围筛选是为了排除1234这类非年份的4位数字;
  • 如果字符串存在重叠的4位数字(比如12345会提取1234和2345),可根据实际需求调整递归步长,但这种情况在年份场景中极少出现。

内容的提问来源于stack exchange,提问作者Soaps

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 18:06:30