-
Меня интересует 2 вопроса:
1) как грамотно считать timestamp
2) как правильно сделать SELECT относительно какого-то конкретного timestamp
Есть у меня в таблице 1 запись, timestamp поле равно 0x00000000000007D5
Делаю обычный SELECT, получаю массив из 8 байтов
Если представить данные как double, то получается -4.02454133360074E101
Если представить как Int64, то получается -3096506218793926656
С условной выборкой по timestamp тоже не понятно
Разъясните пожалуйста
-
"0x00000000000007D5" я скопировал из Management Studio
там судя по всему указывается последовательность байт, от первого к последнему, а не int64
так что 0xD5070000000000000 - вполне себе отрицательное число -3096506218793926656
-
> там судя по всему указывается последовательность байт, от первого к последнему, а не int64
так и есть, чтобы получить интеджер на клиенте нужно слова/байты в обратном порядке переставить... т.е. как в числах принято. или на сервере CAST(xxx AS INT) MSSQL свой тип понимает.
-
Это относительное число
Счетчик изменений. В Oracle примерный аналог SCN
-
зачем он тебе нужен? это не тип времени, это простой "автоинкремент редактирования". для проверки - "не редактировалась ли запись кем то с того времени как сам ее прочитал". сравнить на равенство и набор байт можно, и double и Int64, значение в нем не важно, важно изменилось или нет.
-
> CAST(xxx AS INT)
ага.
> DevilDevil ©
Только зачем оно тебе?
Сравнивай там же, where timestamp1 > timestamp2 / if timestamp1 < timestamp2
на клиенте в виде числа оно накой?
-
> sniknik © (16.04.13 15:20) [2]ну это понятно
но!
я попробовал такой запрос
SELECT * FROM [dpo_documents].[dbo].[users]
where (version <= 0x7d5)
и у меня отобразилась нужная строка
правильно
но!
срабатывает и эта запись (а это уже не правильно!)
SELECT * FROM [dpo_documents].[dbo].[users]
where (version <= 0x7d4)
-
> срабатывает и эта запись (а это уже не правильно!)
2 байта (0x7d4) по не равны 8ми...
-
хочешь сказать надо построчно сравнивать что ли ?
-
попробовал такую запись, так срабатывает
SELECT * FROM [dpo_documents].[dbo].[users]
where (CAST(version as BIGINT) <= 0x7d5)
так не срабатывает
SELECT * FROM [dpo_documents].[dbo].[users]
where (CAST(version as BIGINT) <= 0x7d4)
но вот насколько это правильно ?
-
> но вот насколько это правильно ?
да пофигу если работает.
срабатывает и эта запись (а это уже не правильно!)
SELECT * FROM [dpo_documents].[dbo].[users]
where version <= Cast(Cast(0x7d4 AS int) AS binary(8))
внутренне преобразование чтобы нули в байтах были спереди... без него в общем тоже не сработает.
или
SELECT * FROM [dpo_documents].[dbo].[users]
where Cast(version AS int) <= Cast(0x7d4 AS int)
-
> но вот насколько это правильно ?
авто преобразование... не нравится, лучше явно.
-
> авто преобразование... не нравится, лучше явно.
как ?
-
timestamp - не ключ ведь?
во всяком МС не рекомендует его ключом..
Тогда зачем его вообще получать?
SELECT * FROM [dpo_documents].[dbo].[users] U
where U.version <= GetLastVerKnowUserById(U.USER_ID);
и пофиг как он там сравнивать будет внутри