двоеточие (:) и точка (.) как разделитель миллисекунд в datetime2 - PullRequest
0 голосов
/ 05 мая 2018

Я перенес базу данных Sybase на SQL server 2008 . Основное приложение, использующее базу данных, пытается установить столбец dateTime2 с данными, такими как 1986-12-24 16:56:57:81000, который выдает эту ошибку:

Ошибка преобразования при преобразовании даты и / или времени из символьной строки.

Выполнение того же запроса с использованием точки (.) Вместо двоеточия (:) в качестве разделителя миллисекунд, например 1986-12-24 16:56:57.81000, или ограничение миллисекунд до 3 цифр, например 1986-12-24 16:56:57:810, решит проблему.

Примечание:
1. У меня нет доступа к источнику приложения, чтобы решить эту проблему, и есть много таблиц с той же проблемой.
2. Приложение подключается к базе данных через ODBC-соединение.

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

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Выберите REPLACE (getdate (), ':', '.')

Но он даст String Formate для datetime, которое не скрыто в DateTime Formate

0 голосов
/ 06 мая 2018

КАК Гордон Линофф сказал

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

Но есть простой ответ!
Использование SQL Server Native Client Connection вместо базового SQL Server ODBC connection обрабатывает все.

Примечание:
1. Поскольку я использовал SQL Server 2008 версии 10 собственного клиента SQL Server, он работает нормально, но не версии 11 (это для SQL Server 2012).
2. Use Regional Settings создайте другую проблему с конвертацией, поэтому не используйте ее, если она вам не нужна.

0 голосов
/ 05 мая 2018

Зачем вам нужны триггеры? Вы можете использовать update, чтобы изменить последние ':' на '.':

update t
    set col = stuff(col, 20, 1, '.');

Вы также ошибочно описываете столбец как datetime2. Это использует внутренний формат даты / времени. Ваш столбец явно является строкой.

EDIT:

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

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

Вы могли бы заставить работать триггер, создавая представления и создавая триггер для представления, но это еще хуже. Возможно, самое простое решение было бы:

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