2014-12-05 160 views
0

我想在下面提取@value變量中的日期。T-sql子字符串函數提取特定的字符串

Declare @value nvarchar(61)= 'Generated by [email protected] on 12/5/2014 1:00:13 PM from ATOM.' 

Select SUBSTRING(@value,43,len(@value)) 

但小問題,就是「[email protected]」是可變的,有來自43

位移開始指數有沒有更好的方式來做到這一點,我寧願方式從哪裏開始子串的位置將從@value的最後一個索引開始,並計數回來。

+0

常數也更然後61個字符... – gbn 2014-12-05 13:01:35

+0

我真的* *會考慮使用ISO-8601的日期格式以確保每個日期和時間長度都是標準化的,並且獨立於本地設置。我是英國人,你的日期/時間格式坦白地說是無稽之談 – gbn 2014-12-05 13:26:06

回答

2
Declare @value nvarchar(100)= 'Generated by [email protected] on 12/5/2014 1:00:13 PM from ATOM.' 

Select LEFT(REVERSE(LEFT(REVERSE(RTRIM(@value)), 31)),20) 

現在男孩和女孩,所有的日期格式的解決方案,以及可變長度後綴

Declare @values table (value nvarchar(100) NOT NULL); 

INSERT @values VALUES 
    ('Generated by [email protected] on 2/2/2014 1:00:13 PM from ATOM.'), 
    ('Generated by [email protected] on 17/2/2014 1:00:13 PM from SOmewhere.'), 
    ('Generated by [email protected] on 2/11/2014 1:00:13 PM from NeverNeverLand.'), 
    ('Generated by [email protected] on 12/11/2014 1:00:13 PM from X.') 


SELECT 
    RTRIM(SUBSTRING(V.value, PATINDEX(X.Pattern, V.value)+1, X.Patlength)) 
FROM 
    @values V 
    JOIN 
    (
    VALUES 
     ('% [1-9]/[1-9]/2[0-3][0-9][0-9]%', 20), 
     ('% [1-3][0-9]/[1-9]/2[0-3][0-9][0-9]%', 21), 
     ('% [1-9]/1[0-2]/2[0-3][0-9][0-9]%', 21), 
     ('% [1-3][0-9]/1[0-2]/2[0-][0-9][0-9]%', 22) 
    ) X (Pattern, Patlength) ON PATINDEX(X.Pattern, V.value) > 0 
+0

感謝GBN,這是工作!投票這個! – 2014-12-05 13:06:03

+1

這不起作用。如果日期是2004年12月12日怎麼辦? – DavidG 2014-12-05 13:08:33

+0

甚至「1/1/2004」還是年份可能是兩位數? – DavidG 2014-12-05 13:13:44

1

使用CHARINDEX查找的字符串on,然後使用它作爲起點,然後做同樣from後刪除文本:

Select SUBSTRING(@value,CHARINDEX(' on ', @value)+4,CHARINDEX(' from ', SUBSTRING(@value,CHARINDEX(' on ', @value)+4,len(@value)))) 
+0

這也與時間相關 – gbn 2014-12-05 13:21:24

+0

@gbn事實上,我複製了OP原始查詢的結果。 – DavidG 2014-12-05 13:22:43

+0

雖然容易修復,但忽略它。 – gbn 2014-12-05 13:24:40