Позвольте мне начать с того, что datetime не имеет понятия формата отображения.
Формат отображения имеет значение, только когда мы говорим о строковых представлениях значений даты и времени.
Тогда , давайте взглянем на используемый вами формат: yyyy-MM-dd HH:mm:ss
(известный как ODB C canonical).
При преобразовании строк этого формата в DateTime
результат преобразования зависит от культуры. Это означает, что при работе на некоторых языках (например, Engli sh) SQL Сервер будет пытаться использовать yyyy-MM-dd
в качестве даты, но на других языках (например, немецком) он будет пытаться использовать yyyy-dd-MM
в качестве даты.
Это причина, по которой вы получаете ошибку конвертации.
Важное примечание: Если вы явно не установите язык (или DateFormat, если на то пошло), SQL Сервер будет использовать язык входа по умолчанию - поэтому для некоторых пользователей преобразование может завершиться неудачно в то время как для других пользователей это будет успешным.
Другое замечание: эта проблема существует только с DateTime
, но не с DateTime2
- преобразование этого формата в DateTime2
всегда будет интерпретируется как yyyy-MM-dd
.
Итак, учитывая всю эту информацию, у вас есть три варианта:
- Прекратить использование DateTime, вместо этого используйте DateTime2.
- Вместо при использовании небезопасного канонического формата ODB C используйте безопасный формат ISO8601 всякий раз, когда имеете дело со строковым представлением значений даты и времени:
yyyy-mm-ddThh:mi:ss.mmm
. - Явно язык установки или формат даты (к ymd) перед вашим оператором вставки.
Я бы порекомендовал объединить первые два и, по возможности, избегать использования третьего.
DateTime2
является лучшим типом данных, чем * 1 044 * и ISO 8601 - это универсальный стандарт, который поддерживается на разных платформах и языках как однозначный формат даты и времени.