Дополнительно
Ошибка преобразования при преобразовании даты и/или времени из символьной строки при вставке datetime
Я пытался создать таблицу следующим образом,
create table table1(date1 datetime,date2 datetime);
Сначала я попробовал вставить значения, как показано ниже,
insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');
Это привело к ошибке,
Невозможно преобразовать varchar в datetime
Затем я попробовал следующий формат, предложенный в одном из постов нашего stackoverflow,
insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
,convert(datetime,'01-01-2001 12:00:00 AM',5));
Но все равно получаю ошибку,
Сбой преобразования при преобразовании даты и/или времени из символьной строки.
Есть предложения?
143
12
SQL Server поддерживает множество форматов - смотрите MSDN Books Online on CAST and CONVERT. Большинство из этих форматов зависит от того, какие настройки вы имеете - поэтому эти настройки могут работать в некоторых случаях, а иногда нет.
Способ решения этой проблемы - использовать (слегка адаптированный) ISO-8601 формат даты, который поддерживается SQL Server - этот формат работает всегда - независимо от языка SQL Server и настроек формата даты.
Формат ISO-8601 поддерживается SQL Server в двух вариантах:
YYYYMMDD
для просто дат (без временной части); обратите внимание: без тире!, это очень важно!YYYY-MM-DD
является НЕ независимым от настроек формата даты в вашем SQL Server и будет НЕ работать во всех ситуациях!или:
YYY-MM-DDTHH:MM:SS
для дат и времени - обратите внимание: этот формат имеет тире (но они могут быть опущены), и фиксированныйT
в качестве разделителя между датой и временем в вашемDATETIME
.Это действительно для SQL Server 2000 и более новых версий.
Так что в вашем конкретном случае - используйте эти строки:
и все будет в порядке (примечание: для этого нужно использовать международный 24-часовой формат, а не 12-часовой AM/PM).
Альтернатива: если вы используете SQL Server 2008 или новее, вы также можете использовать тип данных
DATETIME2
(вместо простогоDATETIME
) и ваш текущийINSERT
будет работать без проблем! :-)DATETIME2
намного лучше и намного менее придирчиво относится к преобразованиям - и в любом случае это рекомендуемый тип данных даты/времени для SQL Server 2008 или новее.Не спрашивайте меня, почему вся эта тема такая запутанная и немного сбивает с толку - просто так оно и есть. Но с форматом
YYYYMMDD
все должно быть в порядке для любой версии SQL Server и для любого языка и формата даты в вашем SQL Server.Конвертация в SQL-сервере иногда не удается не из-за используемых форматов даты или времени, а просто потому, что вы пытаетесь хранить неправильные данные, которые неприемлемы для системы.
Пример:
Создать таблицу MyTable (MyDate);
.Insert Into MyTable(MyDate) Values ('2015-02-29');
.SQL-сервер выдаст следующую ошибку:
Conversion failed when converting date and/or time from character string.
.Причина этой ошибки заключается в том, что просто нет такой даты (29 февраля) в году (2015).
Простой ответ - 5 - это итальянский "yyy", а 105 - итальянский "yyy". Следовательно:
будет работать правильно, но
выдаст ошибку.
Аналогично,
даст ошибку, в то время как
будет работать.
По возможности следует избегать культуре конкретных литералов даты и времени.
Есть некоторые безопасность форматы, чтобы обеспечить дату/время как литерал:
Все примеры для 2016-09-15 17:30:00`
Для ODBC (мой любимый, так как он обрабатывается как настоящий тип автоматически)
{ц'2016-09-15 17:30:00'}
--штамп времени{д'2016-09-15'}
--Дата только{Т'17:30:00'}
--время толькоВ формате iso8601 (лучший для везде)
'2016-09-15T17:30:00'
--быть в курсе " т " в середине!Unseperated (крошечный риск получить ошибочно истолкованы как число)
'20160915'
--только для чистого датаХорошо, чтобы иметь в виду: недопустимые даты, как правило, показывают с странные ошибки
Еще одна причина для странной ошибки преобразования: порядок выполнения!
SQL-сервер хорошо знаю, чтобы делать вещи в порядок можно не ожидать. Ваше письменное заявление выглядит как преобразование делается до какой тип действий имеет место, но двигатель решает, - почему-либо - делать преобразования в дальнейшем.
Вот большая статья, объясняя это на примерах: Rusano.com: "t-sql-functions-do-no-imply-a-certain-order-of-execution" и вот это вопроса.
Просто обновить формат даты, как ниже
Это решает проблему для меня, и она отлично работает
лучший способ это код
Пожалуйста, попробуйте это.
В SQL Server ожидает даты в формате ММ/ДД/гггг,если английский как язык по умолчанию.Вот коплю значение datepicker к базе sql2008.Мой тип поля datetime в базе данных.dpdob мое имя элемента datepicker.
Теперь использовать DOB в свой вставить запрос.
Формат даты на самом деле, который работает на SQL сервер
Вы можете попробовать этот код
У меня была эта проблема при попытке объединить `функции getdate () в строку, которую я вставила в тип данных nvarchar поле.
Я сделал некоторые формы, чтобы обойти это:
Что'ы подчищенный пример. Ключевую часть, которая является:
...' + литой(литой(функции getdate() в качестве типа datetime2) как nvarchar) + '...
Литые дату как
типа datetime2
, тогда какаргумент
, чтобы объединить его.установить культуру на английском из интернета.файл config
например, если вы установите культуры на арабском этапе будет
22/09/2017 02:16:57.
и вы получаете ошибку:ошибка преобразования даты или времени из символьной строки при вставке датавремя