时间戳列上的 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 是一个已弃用的同义词)是一种二进制数据类型。它与 datetime
s 无关。因此 CAST
将值的十六进制字符串表示形式 datetime/string 以执行 LIKE
将不起作用。您需要计算哪些二进制值将具有以输入字符串开头的十六进制字符串表示形式。
假设完整的 rowversion 十六进制字符串的长度为 18,那么您可以用 0
s 填充输入字符串的其余部分以获得 LIKE
应该 return(它是否适用于十六进制字符串 - 但它不适用)。然后,最大值要么是带有 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
和 [=] 之间的所有内容23=]等
然后您可以根据需要将逻辑包装在 UDF 中。
如何在具有时间戳(行版本)数据类型的列上使用 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 是一个已弃用的同义词)是一种二进制数据类型。它与 datetime
s 无关。因此 CAST
将值的十六进制字符串表示形式 datetime/string 以执行 LIKE
将不起作用。您需要计算哪些二进制值将具有以输入字符串开头的十六进制字符串表示形式。
假设完整的 rowversion 十六进制字符串的长度为 18,那么您可以用 0
s 填充输入字符串的其余部分以获得 LIKE
应该 return(它是否适用于十六进制字符串 - 但它不适用)。然后,最大值要么是带有 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
和 [=] 之间的所有内容23=]等
然后您可以根据需要将逻辑包装在 UDF 中。