Что такое таинственный тип меток времени в Sybase?
Недавно я обнаружил таблицу в нашей базе данных 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
Мои вопросы следующие
- Какого черта это метка времени?
- Имеет ли это какое-либо отношение ко времени или дате?
- Могу ли я преобразовать его в дату и время?
- Если это не время или дата, для чего вы их используете?
5 ответов
Какого черта это метка времени?
Тип метки времени определяется как
varbinary(8) null
Имеет ли это какое-либо отношение ко времени или дате?
Имя было выбрано плохо.
Могу ли я преобразовать его в дату и время?
Нет.
Если это не время или дата, для чего вы используете это?
Каждый раз, когда строка со столбцом временной метки вставляется или обновляется, столбец временной метки обновляется автоматически. Обратите внимание, что на самом деле есть два вида временных меток. TIMESTAMP
а также CURRENT TIMESTAMP
, Разница в том, что CURRENT TIMESTAMP
устанавливается только на вставке.
Документация Sybase остановилась на этом, и мне стало интересно, почему, черт возьми, кто-нибудь когда-либо использовал метку времени типа данных. К счастью, я нашел несколько других обсуждений и вывел их на обсуждение при реализации оптимистического управления параллелизмом.
Управление параллелизмом - это метод, гарантирующий, что несколько транзакций могут выполняться в одно и то же время и при этом приводить к получению правильных данных. Оптимистичное управление параллелизмом - это метод управления параллелизмом, который предполагает, что несколько транзакций могут завершаться, не мешая друг другу. Т.е. блокировка не требуется. Википедия описывает следующий алгоритм:
- Запишите дату / время отметки, когда транзакция начинается
- Чтение / обновление данных
- Проверьте, изменила ли другая транзакция данные
- Фиксация или откат
Тип данных временной метки Sybase можно использовать в шагах 1 и 3 этого алгоритма вместо использования даты / времени. Но мне не кажется, что это экономит вам много времени при использовании типа данных datetime. Я полагаю, это может работать лучше.
Недавно кто-то спросил меня, возможно ли преобразовать тип данных TIMESTAMP SYBASE IQ в DATE; Я всегда избегал этого типа данных, потому что это тьма. После нескольких часов чтения документации SYBASE и выполнения некоторых тестов, вот мои выводы:
TIMESTAMP:
- Это число из 12 цифр, хранящееся как BINARY (это может варьироваться в зависимости от среды)
- Это представляет значение в микросекундах с 1970 года 1 января
- 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, как показано ниже:
- http://www.fileformat.info/tip/java/date2millis.htm
- http://www.esqsoft.com/javascript_examples/date-to-epoch.htm
Примечание. В случае SYBASE ASE тип TIMESTAMP не является допустимым UNIX-EPOCH.
Вы приняли совершенно неверный ответ.
Какого черта это метка времени?
В разговорных терминах CS это отметка о том, когда строка последний раз ОБНОВЛЯЛАСЬ или ВСТАВЛЯЕТСЯ. С точки зрения CS, поскольку у нас есть IEC/ISO/ANSI SQL, и поскольку это то, что реализует Sybase.
TIMESTAMP - это тип данных. Он содержит эпоху Unix в миллисекундах. Это стандартный тип данных, который используется для определения того, изменилась ли строка с момента последнего просмотра. Он используется в системах корпоративного класса как базовая форма Оптимистической блокировки и здесь поддерживается сервером.
Имеет ли это какое-либо отношение ко времени или дате?
Ну да, но только если вы понимаете, как дата и время хранятся в компьютере в битах. это
И нет, если вы ожидаете увидеть "дату" или "время" в виде открытого текста (для этого лучше использовать один из типов данных ( DATETIME или DATE или TIME)).
Могу ли я преобразовать его в дату и время?
Конечно. Преобразование этого не предназначено, его использование является полностью внутренним, документация заявляет, что это не может быть сделано. Это означает, что это нельзя сделать напрямую, используя CONVERT(DATETIME, ...).
Таким образом, вы должны быть косвенными. Я написал конверсию в 1997 году, а затем в 2004 году, так что я уверен, что это можно сделать и сделать легко, но это немного сложно. У меня сейчас нет под рукой ASE, поэтому я не могу дать код.
Тем не менее, я предоставил достаточно подробностей в этом ответе, чтобы вы могли его кодировать: вам, возможно, придется провести некоторое исследование, понять Unix Epoch; понять, как хранится BINARY; преобразовать двоичный код в целое число, а затем использовать:
DATEADD(MS, your_integer_in_ms, "01 Jan 1970 00:00:00")
Возможно, вам придется добавить @DBTS к нему (который также нуждается в том же преобразовании), я не помню.
Обратите внимание, что проблемы Endian не являются предметом обсуждения, если код находится на том же сервере Sybase ASE, что, конечно, должно быть. Я говорю это потому, что некоторые из Sybase-гуру не понимают проблем Endian, и поэтому они прорабатывают их в каждом ответе, чтобы быть в безопасности, даже если это не относится.
После того, как вы это сделали, вы также можете выполнить арифметику даты (например, DATEADD() и т. Д.).
Более подробная информация:
Обратите внимание, что для использования функции, для которой предназначен TIMESTAMP, не требуется никакого преобразования (следовательно, TSEQUAL() работает без усилий)
Чтобы непосредственно прочитать столбец TIMESTAMP или сохранить его для использования с TSEQUAL(), обработайте его как BINARY(8), как показано в примере.
Как объяснено, это не похоже на DATETIME или INTEGER.
Если это не время или дата, для чего вы их используете?
Ну, ВРЕМЯ и ДАТА и DATETIME имеют специфическое использование.
TIMESTAMP также имеет конкретное применение.
Это столбец отметки времени, который автоматически обновляется сервером и не может быть нарушен или обойден кодом приложения (SQL).
Цель
Для внутренней записи, когда строка была вставлена и последний раз обновлена.
- Если у вас возникли трудности с тем, что временная метка не содержит того, что, как вы думаете, она должна содержать, имейте в виду, что название соответствует стандартному требованию ISO/IEC/ANSI, и Sybase Engineering, вероятно, не думала консультироваться с вами до того, как они внедрили стандарт.
DB2 и MS SQL также имеют тип данных TIMESTAMP.
- Если вы привыкли к не-SQL, некоторые из них реализуют столбец с тем же именем, который не имеет ничего общего со стандартом IEC / ISO / ANSI, но тогда они не предоставляют SQL в соответствии с SQL IEC / ISO / ANSI либо, так что это не должно быть сюрпризом.
использование
Он используется для Оптимистической блокировки, конструкции, распространенной в OLTP-системах с высокой степенью параллелизма, и совершенно не похож на бесплатные не-SQL; рынок без OLTP; который не имеет сделок; нет ACID Свойства транзакций; и т.д. Базы данных, такие как Sybase и DB2, обслуживают этот рынок и предоставляют полный набор функций и возможностей для реализации таких систем.
Детализация Оптимистическая блокировка выходит за рамки этого вопроса. На самом деле, это учебник.
Как я уже говорил, поскольку Unix Epoch хранится в двоичном виде, а не в формате DATETIME, DATE или TIME, вы можете легко проверить его, обрабатывая его как BINARY(8). Он фиксирован по длине, VAR избыточен.
Он выглядит и ведет себя точно так же, как TIMESTAMP для меня и для разработчиков, которые пишут в стандартном SQL. Но тогда мы не пытаемся преобразовать секунды, начиная с эпохи Unix, хранящейся как Binary, в DATETIME; мы просто используем его как есть, тип данных TIMESTAMP.
(Это ответ, опубликованный отдельным вопросом. Ответы на загадочные вопросы о типе времени 'timestamp' Sybase ASE пользователем без представителя, чтобы добавить его сюда. Я скопировал его в виде вики сообщества, поскольку не хочу претендовать на кредит за это но это должно быть здесь)
Ответ на вопрос №1: "Что за чертова метка времени?"
• Временная метка базы данных Sybase ASE хранится централизованно во внутренней таблице в памяти "dbtable" этой базы данных - эта таблица создается, когда база данных переводится в оперативный режим. Вы можете запросить текущую временную метку БД, выбрав @@dbts - имейте в виду, что это значение временной метки varbinary(8) "База данных" зависит от платформы, т. Е. Подвергается действительному порядку байтов по сравнению с малым порядком байтов.
• Каждая пользовательская таблица может иметь один столбец отметок времени для хранения значений отметок времени "База данных" INSERT / UPDATE данной строки. Все значения столбца метки времени "Таблица" автоматически поддерживаются ASE (как и столбец идентификаторов) при успешном завершении команды TSQL DML. Однако, в отличие от временного сэмпла "Database", временные метки "Table" не зависят от платформы, так как они всегда сохраняются в порядке байтов с прямым порядком байтов независимо от порядка байтов в платформе 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 данной базы данных (которая создается, когда база данных переводится в оперативный режим).
- Примечание1 - Значения столбца временной метки "Таблица" хранятся так же, как и другие значения столбца на страницах данных и / или индексов таблицы базы данных, в которой определен столбец временной метки.
- Примечание 2. Имейте в виду, что запрос метки времени текущей базы данных "База данных" с помощью SELECT @@dbts возвращает ее шестнадцатеричное представление, которое подчиняется порядку байтов платформы ОС.
- Примечание 3. - Напротив, запрос метки времени "База данных" по DBCC dbtable (не рекомендуется) возвращает его шестнадцатеричное представление с прямым порядком байтов, таким образом, оно не зависит от платформы.
- ПРЕДУПРЕЖДЕНИЕ. Когда временная метка "База данных" данной базы данных приближается к своему максимальному пределу, т.е. (0xFFFF, 0xFFFFFFFF), и может потребоваться десятилетие или более, чтобы достичь этой точки в зависимости от частоты операций вставки / обновления в базе данных, ASE будет выдает предупреждение и дальнейшая вставка / обновление невозможны - единственная возможность - экспортировать данные из всех объектов, используя BCP (плюс хранимые процедуры через sp_showtext), удалить базу данных, создать ее заново (с новой почти нулевой базой данных) метка времени) и импортировать данные (и хранимые процедуры).
К вашему сведению - приведенные выше ответы, советы и подсказки являются подлинными и точными, поскольку я работал в Sybase и сейчас работаю в SAP, владеющей продуктом ASE.
Допустим, вы извлекаете данные в ваше приложение. Сделав что-то, вы хотите убедиться, что эта запись была изменена, пока вы не получите (на низком уровне!)?
В этом случае у вас должен быть столбец TIMESTAMP. Сначала вы должны сохранить этот столбец. Непосредственно перед обновлением данных вы должны сравнить каждое значение, чтобы убедиться.
Вот почему этот тип данных существует!
В Sybase ASE временная метка имеет разные значения для разных баз данных на одном сервере.
использовать имя_базы_данных
идти
выберите @@dbts
таким образом, очевидно, что это не связано с Unix Epoch или другими ссылками, связанными со временем.
Он отличается от метки времени от Sybase SQL Anywhere.