繁体   English   中英

从字符串中提取年份

[英]Extract year from string

是否可以从随机字符串中提取年份? 例如“随机文本 20221108 随机文本”

它之前或之后的文本从不相同,但日期格式为“20221108”。

我认为这个查询可以帮助你,

DECLARE @yourText varchar(100) = 'randomtext20221108randomtext'
DECLARE @begin int = PATINDEX('%[0-9][0-9][0-9][0-9]%', @yourText)
DECLARE @end int = @begin + 7

SELECT SUBSTRING(@yourText, @begin, @end - @begin + 1)

如果你只需要一年,你可以做,

SELECT SUBSTRING('randomtext20221108randomtext', PATINDEX('%[0-9][0-9][0-9][0-9]%', 'randomtext20221108randomtext') , 4)

也许以下示例可能对您有用,假设日期都是本世纪

select s, Substring(s, p, 4) [Year]
from (
  values('kdfjgkj44kjf420221108dfkgjhdfiuh45rt'),('qwerty20210409'),('nodate 2345 here')
)t(s)
cross apply(values(NullIf(PatIndex('%2[0-9][0-9][0-9][0-9][1-9][0-9][1-9]%', s),0)))p(p);
create table #randomTexts (col1 nvarchar(max));

insert into #randomTexts values ('randomtext20221108randomtext');
insert into #randomTexts values ('2022asdasd20211108randomtext');
insert into #randomTexts values ('1234567820181108randomtext');
insert into #randomTexts values ('xxx20331332zzz20221108randomtext');

WITH CTE_Numbers AS 
(
    SELECT MAX(LEN(col1))-1 as n FROM #randomTexts
    UNION ALL 
    SELECT n-1 FROM CTE_Numbers
    WHERE n>0
)
SELECT col1,CAST(SUBSTRING(col1,n,8) AS DATE) AS validDate, SUBSTRING(col1,n,4) AS year
FROM #randomTexts
CROSS JOIN CTE_Numbers
WHERE TRY_CAST(SUBSTRING(col1,n,8) AS DATE) IS NOT NULL
AND n+8<= LEN(col1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM