Подтвердить что ты не робот

Каков таинственный тип данных timestamp в Sybase?

Недавно я обнаружил таблицу в нашей базе данных Sybase на работе, которая использует столбец типа timestamp. Если я создам таблицу, используя этот таинственный тип данных 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

Мои вопросы следующие

  • Какая черта - временная метка?
  • Есть ли какое-либо отношение ко времени или дате?
  • Можно ли преобразовать его в datetime?
  • Если это не время или дата, для чего вы его используете?
4b9b3361

Ответ 1

Какая черта - метка времени?

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

varbinary(8) null

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

Нет. Название было выбрано плохо.

Могу ли я преобразовать его в datetime?

Нет.

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

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

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

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

  • Запишите дату/время, когда начинается транзакция.
  • Чтение/обновление данных
  • Проверьте, не изменила ли другая транзакция данные
  • Отмена или откат

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

Ответ 2

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

TIMESTAMP:

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

Вот предложение 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- ЭПОХА.

Ответ 3

Вы приняли абсолютно неверный ответ.

Какая черта - метка времени?

В разговорных условиях CS это штамп, когда последняя строка обновлялась или вставлялась. В конкретных условиях CS, поскольку у нас есть IEC/ISO/ANSI SQL, и поскольку это то, что Sybase реализует.

TIMESTAMP - это Тип данных. Он содержит Unix Epoch в миллисекундах. Это стандартный тип данных, который используется для определения того, изменилась ли строка с момента последнего обращения к ней. Он используется в системах корпоративного класса, как базовая форма оптимистической блокировки, а здесь поддерживается сервером.

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

Ну да, но только если вы понимаете, как дата и время хранятся на компьютере в битах.

И нет, если вы ожидаете увидеть "дату" или "время" в ясном тексте (для этого лучше использовать один из типов данных DATETIME или DATE или TIME).

Можно ли преобразовать его в datetime?

Конечно. Преобразование не предназначено, его использование полностью внутренне, в документации указано, что это невозможно. Это означает, что это невозможно сделать напрямую, используя CONVERT (DATETIME,...).

Итак, вы должны быть косвенными. Я написал конверсию в 1997 году и снова в 2004 году, поэтому я уверен, что это можно сделать и сделать легко, но это немного сложно. У меня сейчас нет ASE, поэтому я не могу дать код.

Однако я дал достаточно подробностей в этом ответе, чтобы вы его закодировали: вам, возможно, придется провести некоторое исследование, понять Unix Epoch; понять, как хранится BINARY; преобразовать двоичный код в целое число, а затем использовать:

  • DATEADD(MS, your_integer_in_ms, "01 Jan 1970 00:00:00")

Возможно, вам придется добавить к нему @DBTS (которому также необходимо такое же преобразование), я не могу вспомнить.

Обратите внимание, что проблемы Endian - это not при условии, что код находится на одном сервере Sybase ASE, что, конечно же, должно быть. Я говорю это, потому что некоторые из гуру Sybase не понимают проблемы Endian, и поэтому они работают через них в каждом ответе, чтобы быть в безопасности, даже если это не применяется.

Как только вы это сделаете, вы также можете выполнить арифметику даты (например, DATEADD() и т.д.).

Дополнительная информация:

  • Обратите внимание, что для использования функции, с которой работает TIMESTAMP, не требуется никакого преобразования (следовательно, TSEQUAL() работает без усилий)

  • Чтобы прочитать столбец TIMESTAMP напрямую или сохранить его для использования с TSEQUAL(), рассматривайте его как BINARY (8) в соответствии с примером.

  • Как объяснено, это не похоже на DATETIME или INTEGER.

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

Ну, TIME, DATE и DATETIME имеют конкретные применения.

TIMESTAMP также имеет конкретное применение.

Это столбец временного штампа, который автоматически обновляется сервером, который не может быть помечен или обойден кодом приложения (SQL).

Цель
Для записи внутри, когда строка была вставлена ​​и обновлена.

  • Если у вас есть трудности с тем, что Time Stamp не содержит то, что, по вашему мнению, он должен содержать, помните, что имя является стандартным требованием ISO/IEC/ANSI, и Sybase Engineering, вероятно, не думала о вас они внедрили стандарт.

DB2 и MS SQL также имеют тип данных TIMESTAMP.

  • Если вы используете не-SQL, некоторые из них реализуют столбец с тем же именем, который не имеет ничего общего со стандартом IEC/ISO/ANSI, но тогда они не предоставляют SQL для IEC/ISO/ANSI SQL, так что это не должно быть неожиданностью.

Использование
Он используется для Оптимистической блокировки, конструкции, общей в OLTP-системах с высоким concurrency, и совершенно чуждой бесплатному не-SQL; не-OLTP-рынок; который не имеет Сделок; нет ACID-свойств транзакций; и т.д. Базы данных, такие как Sybase и DB2, обслуживают этот рынок и предоставляют полный спектр возможностей и возможностей для реализации таких систем.

Детализация Оптимистическая блокировка выходит за рамки этого вопроса. На самом деле это учебник.

Как я подробно рассказал, поскольку Unix Epoch хранится как двоичный, а не как DATETIME или DATE или TIME, вы можете легко проверить его, рассматривая его как BINARY (8). Он фиксируется по длине, VAR является избыточным.

Он выглядит и ведет себя точно так же, как TIMESTAMP для меня, и для разработчиков, которые кодируют в стандартном SQL. Но тогда мы не пытаемся преобразовать секунды, так как эпоха Unix, хранящаяся как двоичная, в DATETIME; мы просто используем его как есть, тип данных TIMESTAMP.

Ответ 4

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

Ответ на Q # 1: "Какая черта - метка времени?"

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

• Каждая таблица пользователя может иметь один столбец временной метки для хранения значений временной метки базы данных INSERT/UPDATE данной строки. Значения столбцов метки "Таблица" автоматически поддерживаются ASE (точно так же, как столбец идентификаторов) при успешном завершении команды TSQL DML. Однако, в отличие от отметки времени "База данных" , значения временной метки "Таблица" независимы от платформы, поскольку они всегда сохраняются в байтовом порядке Big-endian независимо от принципаности платформы O/S (подробнее см. Дополнительную информацию ниже).


Отвечайте на Q # 2: "Есть ли какое-либо отношение к времени или дате?"

Нет, значения в метке "База данных" и "Местные" метки времени не отражают фактическую дату/время.


Отвечайте на Q # 3: "Могу ли я преобразовать его в дату-время?"

Нет, вы не можете преобразовать временную метку "База данных" или "Местные" временные метки своих страниц на дату/время.


Отвечайте на Q # 4: "Если это не время или дата, для чего вы его используете?"

• Временная метка "База данных" увеличивается каждый раз, когда страница в базе данных изменяется или создается, когда постраничная временная метка "Локальная" (внутри ее заголовка страницы) затем синхронизируется с меткой времени "База данных" этой точки в время.

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

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


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

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

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

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

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

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

  • Значения столбцов столбца Note1 -Table 'хранятся точно так же, как и другие значения столбца на страницах данных и/или индексов таблицы базы данных, в которых определен столбец временной метки.
  • Примечание2. Имейте в виду, что запрос текущей метки базы данных "База данных" с помощью SELECT @@dbts возвращает шестнадцатеричное представление, которое подчиняется платформе OS Endianness.
  • Примечание3. Напротив, запрос временной метки базы данных с помощью DBCC dbtable (не рекомендуется) возвращает шестиугольное представление Big-Endian, поэтому он не зависит от платформы.
  • ПРЕДУПРЕЖДЕНИЕ. Когда метка времени базы данных данной базы данных приближается к ее максимальному пределу, то есть (0xFFFF, 0xFFFFFFFF), и для достижения этой точки может потребоваться десятилетие или более, в зависимости от частоты операций вставки/обновления в базе данных, ASE выдаст предупреждение, и никакая дополнительная вставка/обновление не будет возможна - единственный вариант - экспортировать данные из всех объектов с помощью BCP (плюс хранимые процедуры через sp_showtext), отбросить базу данных, создать ее снова (с помощью нового почти-zer "Временная метка базы данных" ) и импортировать данные (и хранимые процедуры).

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

Ответ 5

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

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

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

Ответ 6

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

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

идти

выберите @@dbts

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

Он отличается от timestamp от Sybase SQL Anywhere.