时间戳列上的 LIKE 运算符,SQL 服务器

LIKE operator on timestamp column, SQL Server

如何在具有时间戳(行版本)数据类型的列上使用 LIKE 运算符?

以下是我试过但没有成功的查询。

-- no data is fetched using this SQL
SELECT * FROM TAB
WHERE tRowVersion LIKE '0x000000000000E05%'

-- incorrect syntax near %
SELECT * FROM TAB
WHERE tRowVersion LIKE 0x000000000000E05%

另外,我不能在时间戳值中使用单引号。

-- implicit conversion from data type varchar to timestamp is not allowed
SELECT * FROM TAB
WHERE tRowVersion = '0x000000000000E05'

我想使用 LIKE 运算符查找行版本控制的模式。使用 CAST 我无法找到模式。

有什么想法吗?

谢谢,

Rowversion(其中 timestamp 是一个已弃用的同义词)是一种二进制数据类型。它与 datetimes 无关。因此 CAST 将值的十六进制字符串表示形式 datetime/string 以执行 LIKE 将不起作用。您需要计算哪些二进制值将具有以输入字符串开头的十六进制字符串表示形式。

假设完整的 rowversion 十六进制字符串的长度为 18,那么您可以用 0s 填充输入字符串的其余部分以获得 LIKE 应该 return(它是否适用于十六进制字符串 - 但它不适用)。然后,最大值要么是带有 Fs 的填充,要么是添加(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 0x000000000000E0500x000000000000E05F 之间的所有内容,对于 0x000000000000E 0x000000000000E000 和 [=] 之间的所有内容23=]等

然后您可以根据需要将逻辑包装在 UDF 中。