Что такое таинственный тип меток времени в Sybase? - PullRequest
16 голосов
/ 17 августа 2010

Я недавно обнаружил таблицу в нашей базе данных Sybase на работе, которая использует столбец типа 'timestamp'. Если я создаю таблицу, используя этот таинственный тип данных временной метки, как этот

create table dropme (
    foo timestamp,  
    roo int null
)
insert into dropme (roo) values(123)
insert into dropme (roo) values(122)
insert into dropme (roo) values(121)
select * from dropme
go

Я получаю следующее от 'select * from dropme':

 foo                  roo
 -------------------- -----------
   0x000100000e1ce4ea         123
   0x000100000e1ce4ed         122
   0x000100000e1ce509         121

0x000100000e1ce4ea не выглядит для меня очень меткой времени. Кроме того, я вижу этот вывод из 'sp_help timestamp':

 Type_name Storage_type Length Prec Scale Nulls Default_name Rule_name Access_Rule_name Identity
 --------- ------------ ------ ---- ----- ----- ------------ --------- ---------------- ----------
 timestamp varbinary         8 NULL  NULL     1 NULL         NULL      NULL                   NULL

У меня следующие вопросы

  1. Какого черта метка времени?
  2. Имеет ли это какое-либо отношение ко времени или дате?
  3. Могу ли я преобразовать его в дату?
  4. Если это не время или дата, для чего вы их используете?

Ответы [ 5 ]

16 голосов
/ 19 августа 2010

Какого черта это временная метка?

Тип данных временной метки определяется как

varbinary(8) null

Имеет ли он какое-либо отношение ко времени илидата?

Нет.Имя было выбрано неправильно.

Можно ли преобразовать его в дату-время?

Нет.

Если это не время илидата, для чего вы его используете?

Каждый раз, когда строка со столбцом временной метки вставляется или обновляется, столбец временной метки обновляется автоматически.Обратите внимание, что на самом деле есть два вида временных меток.TIMESTAMP и CURRENT TIMESTAMP.Разница в том, что CURRENT TIMESTAMP устанавливается только для вставки.

Документация Sybase остановилась на этом, и я удивляюсь, почему f * rainbow! * K кто-нибудь когда-либо использовал метку времени типа данных.К счастью, я нашел несколько других обсуждений и определил их использование при реализации оптимистического управления параллелизмом.

Контроль параллелизма - это метод обеспечения того, что несколько транзакций могут выполняться одновременно или в одно и то же время и при этом давать правильные данные. Оптимистический контроль параллелизма - это метод управления параллелизмом, который предполагает, что несколько транзакций могут завершаться без вмешательства друг в друга.Т.е. блокировка не требуется.Википедия описывает следующий алгоритм:

  1. Запись отметки даты / времени при начале транзакции
  2. Чтение / обновление данных
  3. Проверка, изменила ли другая транзакция данные
  4. Фиксация или откат

Тип данных временной метки Sybase можно использовать в шагах 1 и 3 этого алгоритма вместо использования даты / времени.Но мне не кажется, что это экономит вам много времени при использовании типа данных datetime.Я полагаю, это может работать лучше.

8 голосов
/ 30 июня 2012

Недавно кто-то спросил меня, возможно ли преобразовать тип данных TIMESTAMP SYBASE IQ в DATE; Я всегда избегал этого типа данных, потому что это тьма. После нескольких часов чтения документации SYBASE и выполнения некоторых тестов, я пришел к выводу:

TIMESTAMP:

  • Это число из 12 цифр, сохраняемое как BINARY (это может варьироваться в зависимости от на окружающую среду)
  • Представляет значение в микросекундах с 1 января 1970 года.
  • Sybase не включает прямые функции для их преобразования
  • Он автоматически обновляется каждый раз при вставке записи

Вот SQL-предложение для преобразования TIMESTAMP в DATE:

SELECT timestamp as TS, CONVERT(decimal, timestamp) as TS_IN_MS,
   CONVERT(date, dateadd(SS, CONVERT(int, SUBSTRING(CONVERT(varchar,                     
      CONVERT(decimal, timestamp)), 1, 9)), '1/1/1970'), 123)  as TS_AS_DATE  
   FROM TheTable

Преобразование может быть подтверждено с помощью онлайн-конвертера EPOCH, например:

Примечание : В случае SYBASE ASE тип TIMESTAMP недопустим UNIX-EPOCH .

2 голосов
/ 06 февраля 2015

(Это ответ, опубликованный отдельным вопросом Ответы на загадочные вопросы о типе времени 'timestamp' Sybase ASE пользователем без представителя, чтобы добавить его сюда. Я скопировал его в виде вики сообществапоскольку я не хочу претендовать на кредит, но это должно быть здесь)

Ответ на вопрос №1: «Какого черта метка времени?»

• Метка времени Sybase ASEбаза данных хранится централизованно во внутренней таблице в памяти «dbtable» этой базы данных - эта таблица создается, когда база данных переводится в оперативный режим.Вы можете запросить текущую временную метку БД, выбрав @@ dbts - имейте в виду, что это значение временной метки varbinary (8) «База данных» зависит от платформы, т. Е. Подвергается действительному значению в больших или малых значениях.

• Каждая пользовательская таблица может иметьодин столбец отметки времени для хранения значений отметки времени 'Database' для INSERT / UPDATE данной строки.Все значения столбца метки времени «Таблица» автоматически поддерживаются ASE (так же, как и столбец идентификаторов) при успешном завершении команды TSQL DML.Однако, в отличие от временного интервала «База данных», временные метки «Таблица» не зависят от платформы, поскольку они всегда сохраняются в байтовом порядке с прямым порядком байтов независимо от порядкового номера платформы O / S (подробности см. Ниже).


Ответ на вопрос № 2: «Имеет ли он какое-либо отношение ко времени или дате?»

Нет, значения в метках времени «База данных» и на отметках времени «Локальные» на странице не имеютотражать фактическую дату / время.


Ответ на вопрос № 3: «Могу ли я преобразовать его в дату-время?»

Нет, вы не можете конвертировать метки времени «База данных» или «Локальные» его страниц в дату./ значение времени.


Ответ на вопрос № 4: «Если это не время или дата, для чего вы их используете?»

• Метка времени «База данных» увеличивается на единицу всякий раз, когдастраница в базе данных изменяется или создается, в то время как временная метка соответствующей страницы (в ее заголовке) синхронизируется с временной меткой «База данных» того времени.

• По сравнению с 'Временная метка базы данных в настоящее время, локальная временная метка страницы базы данных отражает относительный возраст последнего обновления или первого создания этой страницы;следовательно, ASE может определить хронологический порядок обновлений / созданий для всех страниц в базе данных.

• Приложение может использовать столбец отметок времени «Таблица» аналогично столбцу идентификаторов, чтобы найти самые последние или наименее недавно добавленные / обновленные строки независимо от значений ключей строк.


Дополнительная информация, предупреждения и предостережения: -

(1) Временные метки «База данных» и «Локальные» хранятся в 3 частях и зависят от порядкового номера платформы ОС.например, 0xHHHH 0000 LLLLLLLL

  • 2-байтовый старший порядок - 0xHHHH
  • 2-байтовый заполнитель - 0x0000
  • 4-байтовый старший порядок - 0xLLLLLLLL

(2) Временная метка пользователя «Таблица» также хранится в 3 частях, но она всегда находится в ориентации старшего разряда.например, 0x0000 HHHH LLLLLLLL

  • 2-байтовый заполнитель - 0x0000
  • 2-байтовый старший порядок - 0xHHHH
  • 4-байтовый старший порядок - 0xLLLLLLLL

(3) Временная метка базы данных хранится в dbtable системной таблицы в памяти данной базы данных (которая создается, когда база данных переводится в оперативный режим).

  • Note1-«Таблица» Значения столбца метки времени хранятся так же, как и другие значения столбца на страницах данных и / или индексов таблицы базы данных, в которой определен столбец метки времени.
  • Примечание 2. Имейте в виду, что запрос метки времени текущей базы данных «База данных» с помощью SELECT @@ dbts возвращает ее шестнадцатеричное представление, которое подчиняется порядку байтов платформы ОС.
  • Примечание 3 - Напротив, запрос метки времени 'Database' по DBCC dbtable (не рекомендуется) возвращает его шестнадцатеричное представление с прямым порядком байтов, таким образом, оно не зависит от платформы.
  • WARNING - Когда временная метка «База данных» данной базы данных приближается к своему максимальному пределу, т.е. (0xFFFF, 0xFFFFFFFF), и может потребоваться десятилетие или более, чтобы достичь этой точки в зависимости от частоты операций вставки / обновления в базе данных, ASE будетвыдает предупреждение и дальнейшая вставка / обновление невозможны - единственная возможность - экспортировать данные из всех объектов, используя BCP (плюс хранимые процедуры через sp_showtext), удалить базу данных, создать ее заново (с новой почти нулевой базой данных)отметка времени) и импортируйте данные (и хранимые процедуры).

К вашему сведению - приведенные выше ответы, советы и подсказки являются подлинными и точными, так как я работал в Sybase и теперь работаю в SAP, владеющей продуктом ASE.

1 голос
/ 27 августа 2010

Допустим, вы извлекаете данные в ваше приложение.Сделав что-то, вы хотите убедиться, что эта запись была изменена до тех пор, пока не получите (на низком уровне!)?

В этом случае у вас должен быть столбец TIMESTAMP .Сначала вы должны сохранить этот столбец.Непосредственно перед обновлением данных вы должны сравнить каждое значение, чтобы убедиться.

Вот почему этот тип данных существует!

0 голосов
/ 10 октября 2013

В Sybase ASE отметка времени имеет разные значения для разных баз данных на одном сервере.

использовать имя_базы_данных

go

select @@ dbts

поэтому очевидно, что он не связан с Unix Epoch или другими ссылками, связанными со временем.

Он отличается от метки времени от Sybase SQL Anywhere.

...