获取介于两个字符之间的字符串值

Getting a string value that is between two characters

我需要获取介于 !03 和 !03 之间的值。

示例:

JDC!0320151104!03OUT 

我应该在 return 中得到以下字符串:20151104

注意:字符串并不总是 22 个字符长,但我只关心 !03 和 !03 之间的值。

这就是我目前所拥有的。我无法取得比这更进一步的任何进展:

SELECT 
SUBSTRING(
RegStatsID, 
CHARINDEX('!', RegStatsID) + 3, 
CHARINDEX('!', REVERSE(RegStatsID))
)
 From TableX

我通过执行以下操作得到了正确的结果:

SELECT 
 SUBSTRING(
    RegStatsID, 
    CHARINDEX('!', RegStatsID) + 3, 
    len(RegStatsID) - CHARINDEX('!', RegStatsID ) - 2 -  CHARINDEX('!', Reverse(RegStatsID))
)

太好了,您找到了解决方案!

这可能会更好:

通过用 XML 标签替换“!03”,您可以轻松选择第二个 "node"。您的字符串将被转换为 <x>JDC</x><x>20151104</x><x>OUT</x>:

DECLARE @test VARCHAR(100)='JDC!0320151104!03OUT';

SELECT CAST('<x>' + REPLACE(@test,'!03','</x><x>') + '</x>' AS XML).value('/x[2]','datetime')

一个优点是获得两个键入的“!03”之间的值。在这种情况下,您会得到一个 "real" 日期时间,而无需任何进一步的转换。如果值在所有情况下都没有日期时间(或日期),则只需使用 nvarchar(max) 作为类型。

另一个优点是:如果你 - 为什么 - 以后需要其他值,你只需将它们与 .value('/x[1 or 3]'...)