Ответ 1
Тип данных временной метки Transact-SQL - это двоичный тип данных без привязки к времени.
Итак, чтобы ответить на ваш вопрос: есть ли способ получить значение DateTime из столбца типа timestamp?
Ответ: Нет
Мне нужен выбор из таблицы, в которой нет столбца, который указывает, когда была вставлена строка, только столбец timestamp
(значения: 0x0000000000530278). Некоторые данные были импортированы в таблицу вчера, и теперь мне нужно выяснить, что именно было импортировано: (
Есть ли способ сделать это, используя только timestamp
info? Здесь я обнаружил, что:
Возможно, существует способ найти значение timestamp
в определенное время? Это поможет сформировать выбор. Или, может быть, есть хорошо известное решение?
Тип данных временной метки Transact-SQL - это двоичный тип данных без привязки к времени.
Итак, чтобы ответить на ваш вопрос: есть ли способ получить значение DateTime из столбца типа timestamp?
Ответ: Нет
Тип данных timestamp в SQL Server 2005 является синонимом rowversion и представляет собой просто число, которое автоматически увеличивается с каждым обновлением строки.
Вы можете передать его в bigint, чтобы увидеть его значение.
Чтобы получить то, что вы хотите для новых или обновленных строк, вы должны с радостью добавить еще один столбец datetime (lastupdate) и триггер для обновления этого столбца при каждом обновлении.
Для строк, которые уже были вставлены в прошлом, я не думаю, что вы можете что-то сделать, чтобы найти точное время.
Я боюсь, что невозможно конвертировать/отдать 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.
Еще один ответ на ваш вопрос:
Если столбец timestamp является единственным ресурсом для восстановления (без резервного копирования и т.д.), вы можете попытаться использовать следующую логику
Timestamp - это просто значение счетчика, которое увеличивается для каждой операции вставки или обновления, которая выполняется в таблице, содержащей столбец временной метки.
Если вчерашний импорт данных состоял из одной вставки нескольких записей, вы можете увидеть последовательность чисел в столбце временной метки, например, например:
0x00000000000007D1
0x00000000000007D2
0x00000000000007D3
0x00000000000007D4
0x00000000000007D5
Самая последняя последовательность может быть вашими добавленными данными (конечно, это не гарантировано) Вы сопоставляете эти знания с другими вещами (например, столбцом автоматического увеличения, если используете их), чтобы идентифицировать интересующие вас записи.
Другие люди правильно указали, что метка времени является двоичным счетчиком. Тем не менее, если в любой таблице вашей базы данных есть метка времени и дата, когда она была записана, вы можете использовать эту информацию для перехода от любой временной метки к диапазону дат. Для этой цели хорошим примером является таблица журналов. Предполагая, что ваша таблица импорта - это "счета-фактуры", вы можете использовать следующий запрос:
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
Я считаю, что лучше всего восстановить резервную копию до вставки и сравнить резервную таблицу с текущей таблицей.
Чтобы идентифицировать новые строки по меткам времени, вам нужно отслеживать отметки времени, которые были там заранее. В крайнем случае вы могли:
При незначительном риске ложных срабатываний, если что-то еще происходит в БД, это даст вам достаточно хорошую разницу.
Для более надежной проверки вы можете рассчитать хеши MD5 или SHA-1 с Hashbytes в содержимом строки, чтобы дать вам разницу с очень низкая вероятность столкновения (см. статью wikipedia на Дня рождения для обсуждения этой проблемы).
Я знаю, что слишком поздно, но может помочь кому-то другому.
Timestamp/RowVersion может быть отправлена в BigInt, но в любом случае ее нельзя сравнивать с datetime.
Следующий оператор берется из MSDN
Тип данных Transact-SQL rowversion не является типом данных даты или времени. timestamp - устаревший синоним rowversion.
Подробнее см. здесь