Rowversion(其中时间戳是不推荐使用的同义词)是二进制数据类型。datetime
与s无关。因此CAST
,将值的十六进制字符串表示为 datetime/string 以执行 aLIKE
将不起作用。您需要计算哪些二进制值将具有以输入字符串开头的十六进制字符串表示形式。
假设完整的 rowversion 十六进制字符串的长度为 18,那么您可以用0
s 填充输入字符串的其余部分以获得应返回的最小值LIKE
(如果它可以与十六进制字符串一起使用 - 它不能)。然后最大值将是一个带有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
这将为您提供所需的结果,即对于and之间的0x000000000000E05
所有内容,对于 and 之间的所有内容等。0x000000000000E050
0x000000000000E05F
0x000000000000E
0x000000000000E000
0x000000000000EFFF
然后,您可以根据需要将逻辑包装在 UDF 中。