У меня есть (DT_DBTIMESTAMP2,7)GETDATE()
в столбце преобразования производных столбцов SSIS и столбца таблицы с datetime2 (7).
Несмотря на то, что я установил 7-значную шкалу секунд в обоих, кажется, что это всего лишь 3-значная шкала.
Например, я ожидал, что '2018-05-02 16:45: 15.6192346', но получается '2018-05-02 16:45: 15.6190000 '.
Причина, по которой мне нужны миллисекунды, я хотел бы отсортировать последнюю запись от любых дубликатов, используя временную метку. Я понял, что только трехзначной второй шкалы для этого недостаточно.
Есть ли какие-либо обязательные настройки в пакете SSIS, за исключением преобразования производных столбцов и столбцов таблицы? Любые советы будут оценены.
GETDATE()
возвращает datetime
, вместо него следует использовать SYSDATETIME()
. См. документация.
редактировать
Как отметил Ларну, вы, вероятно, используете выражение SSIS GETDATE, а не выражение SQL GETDATE, как я предполагал. Но суть более или менее та же. GETDATE возвращает DT_DBTIMESTAMP
, где «Дробные секунды имеют максимальный масштаб из 3 цифр». (Источник).
@Larnu, Хороший момент, я не знал, что существует выражение SSIS с таким же названием. Отредактировано.
Хотя это почти то же самое, что сказал HoneyBadger, я немного расширяюсь, поскольку OP не использует выражение GETDATE()
в SQL Server. Значение 2018-05-02 16:45:15.619
никогда не может быть возвращено GETDATE()
(Transact-SQL), поскольку оно имеет точность только до 1/300 секунды (таким образом, последняя цифра может быть только каждые 0,3 и 7 (технически 0, 333333333 ~ и 666666666 ~, поэтому последняя цифра - 7, так как она округлена в большую сторону)).
В SSIS выражение GETDATE()
возвращает тип данных DB_TIMESTAMP
. Согласно Документация:
A timestamp structure that consists of year, month, day, hour, minute, second, and fractional seconds. The fractional seconds have a maximum scale of 3 digits.
Таким образом, теряются последние 4 символа. К сожалению, я не верю, что в SSIS есть функция, которая возвращает текущую дату и время с требуемой точностью. Таким образом, если вам нужен этот высокий уровень, вам, вероятно, потребуется использовать выражение в SQL Server, которое его поддерживает, например SYSDATETIME()
, рекомендованное HoneyBadger.
Ламу и HoneyBadger, большое спасибо за ваш быстрый и добрый ответ. Благодаря вам, наконец, понял, почему он пришел с 3 цифрами. К сожалению, SSIS, похоже, не поддерживает sysdatetime (), поэтому я попробую другие решения для своей цели (и, возможно, вернусь, если я столкнусь с другой проблемой ...). Большое спасибо !
@Sachiko, SSIS GETDATE () возвращает DB_DBTIMESTAMP, а не DB_DBTIMESTAMP2, поэтому это только 3 десятичных знака. Если вам нужна более высокая точность, вы можете использовать преобразование сценария, чтобы назначить DateTime.Now столбцу DB_DBTIMESTAMP2.
Большое спасибо за ваш ценный совет, @Dan :) Я постараюсь добиться большей точности с помощью любых скриптов.
Я думаю, что OP использует выражение SSIS
GETDATE()
, а не выражение SQL ServerGETDATE()
.(DT_DBTIMESTAMP2,7)GETDATE()
не может быть допустимым синтаксисом SQL Server.