Конференция "Базы" » непонятки с timestamp (MS SQL)
 
  • DevilDevil © (16.04.13 14:42) [0]
    Меня интересует 2 вопроса:
    1) как грамотно считать timestamp
    2) как правильно сделать SELECT относительно какого-то конкретного timestamp

    Есть у меня в таблице 1 запись, timestamp поле равно 0x00000000000007D5
    Делаю обычный SELECT, получаю массив из 8 байтов
    Если представить данные как double, то получается -4.02454133360074E101
    Если представить как Int64, то получается -3096506218793926656

    С условной выборкой по timestamp тоже не понятно
    Разъясните пожалуйста
  • DevilDevil © (16.04.13 14:43) [1]
    "0x00000000000007D5" я скопировал из Management Studio
    там судя по всему указывается последовательность байт, от первого к последнему, а не int64
    так что 0xD5070000000000000 - вполне себе отрицательное число -3096506218793926656
  • sniknik © (16.04.13 15:20) [2]
    > там судя по всему указывается последовательность байт, от первого к последнему, а не int64
    так и есть, чтобы получить интеджер на клиенте нужно слова/байты в обратном порядке переставить... т.е. как в числах принято. или на сервере CAST(xxx AS INT) MSSQL свой тип понимает.
  • O'ShinW © (16.04.13 15:22) [3]
    Это относительное число
    Счетчик изменений. В Oracle примерный аналог SCN
  • sniknik © (16.04.13 15:25) [4]
    зачем он тебе нужен? это не тип времени, это простой "автоинкремент редактирования". для проверки - "не редактировалась ли запись кем то с того времени как сам ее прочитал". сравнить на равенство и набор байт можно, и double и Int64, значение в нем не важно, важно изменилось или нет.
  • O'ShinW © (16.04.13 15:26) [5]

    > CAST(xxx AS INT)

    ага.


    > DevilDevil ©

    Только зачем оно тебе?
    Сравнивай там же, where timestamp1 > timestamp2 / if timestamp1 < timestamp2
    на клиенте в виде числа оно накой?
  • DevilDevil © (16.04.13 16:15) [6]
    > 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)

  • sniknik © (16.04.13 16:25) [7]
    > срабатывает и эта запись (а это уже не правильно!)
    2 байта (0x7d4) по не равны 8ми...
  • DevilDevil © (16.04.13 16:29) [8]
    хочешь сказать надо построчно сравнивать что ли ?
  • DevilDevil © (16.04.13 16:30) [9]
    попробовал такую запись, так срабатывает
    SELECT * FROM [dpo_documents].[dbo].[users]
    where (CAST(version as BIGINT) <= 0x7d5)



    так не срабатывает
    SELECT * FROM [dpo_documents].[dbo].[users]
    where (CAST(version as BIGINT) <= 0x7d4)



    но вот насколько это правильно ?
  • sniknik © (16.04.13 16:38) [10]
    > но вот насколько это правильно ?
    да пофигу если работает.

    срабатывает и эта запись (а это уже не правильно!)
    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)

  • sniknik © (16.04.13 16:40) [11]
    > но вот насколько это правильно ?
    авто преобразование... не нравится, лучше явно.
  • DevilDevil © (16.04.13 16:51) [12]
    > авто преобразование... не нравится, лучше явно.

    как ?
  • O'ShinW © (16.04.13 17:34) [13]
    timestamp - не ключ ведь?
    во всяком МС не рекомендует его ключом..

    Тогда зачем его вообще получать?
    SELECT * FROM [dpo_documents].[dbo].[users] U
    where U.version  <= GetLastVerKnowUserById(U.USER_ID);

    и пофиг как он там сравнивать будет внутри
 
Конференция "Базы" » непонятки с timestamp (MS SQL)
Есть новые Нет новых   [119474   +83][b:0][p:0.001]