Rowversion (timestamp は非推奨のシノニム) はバイナリ データ型です。Sとは関係ありませんdatetime
。そのCAST
ため、実行するために値の 16 進文字列表現を datetime/string に変換しても機能しLIKE
ません。代わりに、入力文字列で始まる 16 進文字列表現を持つバイナリ値を計算する必要があります。
完全な rowversion 16 進文字列の長さが 18 であると仮定すると、入力文字列の残りの部分を0
s で埋めて、返される最小値を取得できますLIKE
(16 進文字列で動作する場合は、そうではありません)。最大値は、F
s を使用したパッドまたは追加のケースのいずれかになります (16 にLIKE
- 1 でフィルタリングされる文字数の累乗):
DECLARE @string_to_like varchar(18) = '0x000000000000E05'
DECLARE @chars_to_like int
SELECT @chars_to_like = 18 - len(@string_to_like)
DECLARE @min_rowversion_s varchar(18)
SET @min_rowversion_s = left(ltrim(@string_to_like) + '00000000000000000', 18)
DECLARE @min_rowversion varbinary(8)
SET @min_rowversion = CONVERT(varbinary(8), @min_rowversion_s, 1)
DECLARE @max_value INT
DECLARE @divider int
SET @divider = POWER(16, @chars_to_like)
SELECT @max_value = @min_rowversion + @divider - 1
SELECT * FROM TAB WHERE tRowVersion BETWEEN @min_rowversion AND @max_value
これにより、 と の間のすべて、との0x000000000000E05
間のすべてなど、必要な結果が得られます。0x000000000000E050
0x000000000000E05F
0x000000000000E
0x000000000000E000
0x000000000000EFFF
その後、必要に応じてロジックを UDF にラップできます。