如何在T-SQL中从文本字段提取日期?现有代码适配同表同列场景
提取Comments字段中其他日期的思路
嘿,我来帮你梳理下怎么调整现有代码来提取同一列里其他描述对应的日期!先拆解下你现有的这段提取Visit Date日期的SQL代码逻辑,搞懂原理就好改了:
SUBSTRING(REPLACE(al.Comments + '.','.','{br}'), PATINDEX('%Visit Date%',REPLACE(al.Comments+'.','.','{br}')) + 13, PATINDEX('%{br}%', SUBSTRING(REPLACE(al.Comments+'.','.','{br}'), PATINDEX('%Visit Date%', REPLACE(al.Comments+'.','.','{br}')) + 13, 14))-1))
这段代码的核心玩法是:
- 先把Comments里的
.全换成{br},还特意在末尾加了个.再替换,保证最后肯定有个分隔符,避免找不到日期结尾 - 用
PATINDEX定位到Visit Date的位置,然后往后跳13位(应该是Visit Date:加空格的总长度) - 再从跳完的位置开始找下一个
{br},中间夹的就是咱们要的日期
要提取其他描述的日期,照着这个逻辑改几个关键点就行:
- 替换日期关键词:把代码里的
%Visit Date%换成你要抓取的日期对应的描述,比如要提取入院日期就改成%Admission Date% - 调整偏移位数:别硬写13了,比如新关键词是
Admission Date,后面跟着:,那直接算长度LEN('Admission Date: ')更靠谱,避免硬编码数字出错 - 适配日期长度:代码里最后截取的是最多14位,要是你的目标日期是
YYYY-MM-DD这种10位的,就把这个数字改成10,或者留够长度让PATINDEX自动找分隔符
给你整个灵活点的例子,比如提取Admission Date的日期:
-- 先定义变量,后续改其他日期直接改变量就行 DECLARE @TargetKeyword NVARCHAR(50) = 'Admission Date' DECLARE @KeywordSuffix NVARCHAR(10) = ': ' -- 根据实际情况调整,比如有的是空格或者其他符号 SELECT SUBSTRING( REPLACE(al.Comments + '.', '.', '{br}'), -- 定位关键词位置后,加上关键词和后缀的总长度,跳到日期开头 PATINDEX('%' + @TargetKeyword + '%', REPLACE(al.Comments + '.', '.', '{br}')) + LEN(@TargetKeyword) + LEN(@KeywordSuffix), -- 从日期开头找下一个分隔符,截取中间内容 PATINDEX( '%{br}%', SUBSTRING( REPLACE(al.Comments + '.', '.', '{br}'), PATINDEX('%' + @TargetKeyword + '%', REPLACE(al.Comments + '.', '.', '{br}')) + LEN(@TargetKeyword) + LEN(@KeywordSuffix), 14 -- 这里根据日期格式长度调整,比如10位就写10 ) ) - 1 ) AS ExtractedAdmissionDate FROM YourTableName al -- 记得换成你的实际表名
要是你的目标日期没有固定关键词,比如是类似On 2024-05-20 we finished...这种无标识的日期,那可以直接用PATINDEX匹配日期格式的正则,比如%[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]%来定位日期位置,然后截取对应的长度就行。
内容的提问来源于stack exchange,提问作者DRT
相关产品推荐
相关产品推荐

