SQL Server上的时间戳列上的LIKE运算符

时间:2016-03-21 09:38:41

标签: sql sql-server sql-server-2008 rowversion sql-timestamp

如何在具有时间戳(rowversion)数据类型的列上使用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我无法找到模式。

有什么想法吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

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

假设整个rowversion十六进制字符串的长度为18,那么您可以使用LIKE填充输入字符串的其余部分,以获得F应返回的最小值(是否可以工作)用十六进制字符串 - 它没有&#t; t)。然后,最大值可以是LIKE s的填充或添加的情况(16为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 - 1过滤的字符数量的幂):

0x000000000000E05

这可以为您提供所需的结果,即0x000000000000E050 0x000000000000E05F0x000000000000E之间的所有内容,0x000000000000E000 0x000000000000EFFF和{{1}之间的所有内容等等。

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