Есть ли способ получить значение DateTime из столбца типа timestamp? - PullRequest
11 голосов
/ 07 октября 2008

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

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

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

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

Ответы [ 8 ]

19 голосов
/ 07 октября 2008

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

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

Ответ: Нет

9 голосов
/ 07 октября 2008

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

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

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

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

4 голосов
/ 07 октября 2008

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

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

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

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

3 голосов
/ 07 октября 2008

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

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

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

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

0x00000000000007D1
0x00000000000007D2
0x00000000000007D3
0x00000000000007D4
0x00000000000007D5

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

1 голос
/ 26 апреля 2017

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

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
0 голосов
/ 10 мая 2014

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

Метка времени / RowVersion может быть приведена к BigInt, но в любом случае ее нельзя сравнить с датой / временем.

Следующее заявление взято из MSDN

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

Более подробно см. здесь

0 голосов
/ 07 октября 2008

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

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

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

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

0 голосов
/ 07 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...