Есть ли способ получить значение DateTime из столбца типа timestamp?

Мне нужен выбор из таблицы, в которой нет столбца, который указывает, когда была вставлена ​​строка, только столбец timestamp (значения: 0x0000000000530278). Некоторые данные были импортированы в таблицу вчера, и теперь мне нужно выяснить, что именно было импортировано: (

Есть ли способ сделать это, используя только timestamp info? Здесь я обнаружил, что:

  • Timestamp - это 8-байтовый последовательный шестнадцатеричный номер, который не имеет никакого отношения ни к дате, ни к времени.
  • Чтобы получить текущее значение метки времени, используйте: @@DBTS.

Возможно, существует способ найти значение timestamp в определенное время? Это поможет сформировать выбор. Или, может быть, есть хорошо известное решение?

Ответ 1

Тип данных временной метки Transact-SQL - это двоичный тип данных без привязки к времени.

Итак, чтобы ответить на ваш вопрос: есть ли способ получить значение DateTime из столбца типа timestamp?

Ответ: Нет

Ответ 2

Тип данных timestamp в SQL Server 2005 является синонимом rowversion и представляет собой просто число, которое автоматически увеличивается с каждым обновлением строки.

Вы можете передать его в bigint, чтобы увидеть его значение.

Чтобы получить то, что вы хотите для новых или обновленных строк, вы должны с радостью добавить еще один столбец datetime (lastupdate) и триггер для обновления этого столбца при каждом обновлении.

Для строк, которые уже были вставлены в прошлом, я не думаю, что вы можете что-то сделать, чтобы найти точное время.

Ответ 3

Я боюсь, что невозможно конвертировать/отдать TIMESTAMP в DATETIME. У них совершенно разные применения и реализации, которые несовместимы.

Смотрите эту ссылку http://www.sqlteam.com/article/timestamps-vs-datetime-data-types

Книги on-line также говорят http://msdn.microsoft.com/en-us/library/aa260631.aspx

Тип данных временной метки SQL Server имеет ничего общего со временем или датами. SQL Временные метки сервера - это двоичные числа которые указывают относительную последовательность в какие модификации данных имели место в базы данных. Тип данных временной метки первоначально была реализована для поддержки алгоритмы восстановления SQL Server.

Ответ 4

Еще один ответ на ваш вопрос:

Если столбец timestamp является единственным ресурсом для восстановления (без резервного копирования и т.д.), вы можете попытаться использовать следующую логику

Timestamp - это просто значение счетчика, которое увеличивается для каждой операции вставки или обновления, которая выполняется в таблице, содержащей столбец временной метки.

Если вчерашний импорт данных состоял из одной вставки нескольких записей, вы можете увидеть последовательность чисел в столбце временной метки, например, например:

0x00000000000007D1
0x00000000000007D2
0x00000000000007D3
0x00000000000007D4
0x00000000000007D5

Самая последняя последовательность может быть вашими добавленными данными (конечно, это не гарантировано) Вы сопоставляете эти знания с другими вещами (например, столбцом автоматического увеличения, если используете их), чтобы идентифицировать интересующие вас записи.

Ответ 5

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

WITH TS 
AS
(
SELECT 
    L1.LastDateUpdated, COALESCE(L2.LastDateUpdated, {TS '2099-12-31 00:00:00'}) as LastDateUpdatedTo,
    L1.[TIMESTAMP], L2.[TIMESTAMP] as [TIMESTAMPTo]
FROM 
(
    SELECT L1.[LastDateUpdated]
          ,L1.[TIMESTAMP]
          ,ROW_NUMBER() OVER (ORDER BY L1.[LastDateUpdated]) ID
    FROM [Log] L1
) L1
left join 
(
    SELECT L2.[LastDateUpdated]
          ,L2.[TIMESTAMP]
          ,ROW_NUMBER() OVER (ORDER BY L2.[LastDateUpdated]) ID
    FROM [Log] L2
) L2 
    ON L1.ID = L2.ID - 1
)
SELECT TS.LastDateUpdated, TS.LastDateUpdatedTo, * from [Invoices]
    inner join TS ON [Invoices].Timestamp between TS.Timestamp and 
TS.TIMESTAMPTo
ORDER BY TS.TIMESTAMPTo DESC

Ответ 6

Я считаю, что лучше всего восстановить резервную копию до вставки и сравнить резервную таблицу с текущей таблицей.

Ответ 7

Чтобы идентифицировать новые строки по меткам времени, вам нужно отслеживать отметки времени, которые были там заранее. В крайнем случае вы могли:

  • Восстановить предыдущую версию в другом месте.
  • Скопируйте данные из обеих таблиц в базу данных с нуля.
  • Определите вставленные данные из временных меток, присутствующих в одном, а не другом.

При незначительном риске ложных срабатываний, если что-то еще происходит в БД, это даст вам достаточно хорошую разницу.

Для более надежной проверки вы можете рассчитать хеши MD5 или SHA-1 с Hashbytes в содержимом строки, чтобы дать вам разницу с очень низкая вероятность столкновения (см. статью wikipedia на Дня рождения для обсуждения этой проблемы).

Ответ 8

Я знаю, что слишком поздно, но может помочь кому-то другому.

Timestamp/RowVersion может быть отправлена ​​в BigInt, но в любом случае ее нельзя сравнивать с datetime.

Следующий оператор берется из MSDN

Тип данных Transact-SQL rowversion не является типом данных даты или времени. timestamp - устаревший синоним rowversion.

Подробнее см. здесь