1

!03 と !03 の間の値を取得する必要があります。

例:

JDC!0320151104!03OUT 

返される文字列は次のとおりです: 20151104

注: 文字列は常に 22 文字の長さではありませんが、!03 と !03 の間の値だけに関心があります。

これは私がこれまでに持っているものです。これ以上の進歩はありませんでした:

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

2 に答える 2

1

解決策を見つけてよかったです!

これはより良いかもしれません:

「!03」を XML タグに置き換えると、2 番目の「ノード」を簡単に選択できます。あなたの文字列は次のように変換され<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')

1 つの利点は、入力された 2 つの "!03" の間の値を取得できることです。この場合、それ以上のキャストなしで「実際の」日時が返されます。すべてのケースで日時 (または日付) ではない値がある場合は、単にnvarchar(max)型として使用します。

別の利点は次のとおりです。後で他の値が必要になった場合は、それらを使用するだけです.value('/x[1 or 3]'...)

于 2016-05-10T21:09:13.463 に答える
0

私は次のようにすることでそれを正しくすることができました:

SELECT 
 SUBSTRING(
    RegStatsID, 
    CHARINDEX('!', RegStatsID) + 3, 
    len(RegStatsID) - CHARINDEX('!', RegStatsID ) - 2 -  CHARINDEX('!', Reverse(RegStatsID))
)
于 2016-05-10T21:01:24.683 に答える