Существует ли способ получить значение DateTime из столбца типа метки времени?

Вам нужно использовать оператор s (подстановка), а не просто регулярное выражение. Регулярное выражение позволит вам найти текст; s позволит вам найти и заменить.

Первая часть - это шаблон, который соответствует вашему желанию, а вторая - строка , которая заменяет все того, что было найдено. Если вам нужно потенциально сопоставить это несколько раз в строке, вы добавляете суффикс g (глобально).

$line =~ s/,--(\d+)/,+$1/g;

Это находит каждый ,--, за которым следуют одна или несколько цифр (захваченных паренами в $1), и заменяет строку ,+$1, которая интерполирует захваченное число в строку.

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

$line =~ s/,--/,+/g;

Редактировать: Если строка «найти» всегда только одна цифра, тогда вам не нужно \d+; \d сделает, чтобы захватить одну цифру. Для меня привычка предполагать, что, вероятно, будет случай, когда мне нужно будет записать целое число, а не одну цифру.

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

11
задан marc_s 15 November 2011 в 13:07
поделиться

6 ответов

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

Таким образом отвечать на Ваш вопрос: существует ли способ получить значение DateTime из столбца типа метки времени?

Ответ: Нет

20
ответ дан 3 December 2019 в 01:45
поделиться

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

Можно бросить его к bigint для наблюдения его значения.

Для получения, что Вы хотите для новых или обновленных строк необходимо propably добавить другой столбец даты и времени (lastupdate) и триггер для обновления того столбца с каждым обновлением.

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

9
ответ дан 3 December 2019 в 01:45
поделиться

Я боюсь, что не возможно преобразовать/бросить МЕТКУ ВРЕМЕНИ в ДАТУ И ВРЕМЯ. У них есть совершенно различное использование и реализации, которые являются несовместимыми.

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

В книгах онлайн также говорится http://msdn.microsoft.com/en-us/library/aa260631.aspx

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

4
ответ дан 3 December 2019 в 01:45
поделиться

Другой ответ Вам вопрос:

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

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

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

0x00000000000007D1
0x00000000000007D2
0x00000000000007D3
0x00000000000007D4
0x00000000000007D5

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

3
ответ дан 3 December 2019 в 01:45
поделиться

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

0
ответ дан 3 December 2019 в 01:45
поделиться

Для идентификации новых строк меткой времени, необходимо отслеживать метки времени, которые были там заранее. В повышении Вы могли:

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

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

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

0
ответ дан 3 December 2019 в 01:45
поделиться