2016-03-21 4 views
0

Как я могу использовать оператор LIKE в столбце с типом timestamp (rowversion)?Оператор LIKE на столбце timestamp, SQL Server

Ниже приведены запросы, которые я пробовал, но не повезло.

-- 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 Я не могу найти шаблоны.

Любая идея?

Благодаря,

+0

Возможно, у меня что-то не хватает, но как выглядит 'rowversion' столбец' timestamp'? – Utsav

+0

@Utsav, фактическое имя столбца - tRowVersion с типом данных метки времени. – Aditya

+0

, но что с шестнадцатеричными значениями? Вы храните его таким образом? Или они просто отображаются так. – Utsav

ответ

1

Rowversion (из которых временная метка является устаревшим синонимом) представляет собой бинарный тип данных. Это не имеет никакого отношения к datetime. Как таковой CAST ввод шестнадцатеричного строкового представления значений в datetime/string для выполнения LIKE не будет работать. Вам нужно вместо этого вычислить, какие двоичные значения будут иметь шестнадцатеричные представления строк, начиная с входной строки.

Предполагая длину 18 для полного rowversion шестнадцатеричной строки, то вы могли бы подушечка из остальной части вашей входной строки с 0 с, чтобы получить минимальное значение, LIKE должен вернуться (если бы работать с шестигранными строками - что это Безразлично «т). Максимальное значение будет затем либо быть подушечка с F с или в случае добавления (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 т.д.

Вы можете обернуть логику в ОДС по мере необходимости.

+0

Отлично. Отличный ответ :). Прекрасно работает для меня. Спасибо за усилия;) – Aditya

Смежные вопросы