Ошибка преобразования при преобразовании даты и/или времени из символьной строки при вставке 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));

Но все равно получаю ошибку,

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

Есть предложения?

Комментарии к вопросу (1)
Решение

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 и более новых версий.

Так что в вашем конкретном случае - используйте эти строки:

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

и все будет в порядке (примечание: для этого нужно использовать международный 24-часовой формат, а не 12-часовой AM/PM).

Альтернатива: если вы используете SQL Server 2008 или новее, вы также можете использовать тип данных DATETIME2 (вместо простого DATETIME) и ваш текущий INSERT будет работать без проблем! :-) DATETIME2 намного лучше и намного менее придирчиво относится к преобразованиям - и в любом случае это рекомендуемый тип данных даты/времени для SQL Server 2008 или новее.

SELECT
   CAST('02-21-2012 6:10:00 PM' AS DATETIME2),     -- works just fine
   CAST('01-01-2012 12:00:00 AM' AS DATETIME2)   -- works just fine  

Не спрашивайте меня, почему вся эта тема такая запутанная и немного сбивает с толку - просто так оно и есть. Но с форматом YYYYMMDD все должно быть в порядке для любой версии SQL Server и для любого языка и формата даты в вашем SQL Server.

Комментарии (3)

Конвертация в 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).

Комментарии (2)

Простой ответ - 5 - это итальянский "yyy", а 105 - итальянский "yyy". Следовательно:

SELECT convert(datetime,'21-02-12 6:10:00 PM',5)

будет работать правильно, но

SELECT convert(datetime,'21-02-12 6:10:00 PM',105)

выдаст ошибку.

Аналогично,

SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)

даст ошибку, в то время как

SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)

будет работать.

Комментарии (0)

По возможности следует избегать культуре конкретных литералов даты и времени.

Есть некоторые безопасность форматы, чтобы обеспечить дату/время как литерал:

Все примеры для 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' --только для чистого дата

Хорошо, чтобы иметь в виду: недопустимые даты, как правило, показывают с странные ошибки

  • Нет 31 июня или 30-го февраля...

Еще одна причина для странной ошибки преобразования: порядок выполнения!

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

Вот большая статья, объясняя это на примерах: Rusano.com: "t-sql-functions-do-no-imply-a-certain-order-of-execution" и вот это вопроса.

Комментарии (0)

Просто обновить формат даты, как ниже

yyyy-MM-dd hh:MM:ss

Это решает проблему для меня, и она отлично работает

Комментарии (2)

лучший способ это код

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"
Комментарии (0)

Пожалуйста, попробуйте это.

В SQL Server ожидает даты в формате ММ/ДД/гггг,если английский как язык по умолчанию.Вот коплю значение datepicker к базе sql2008.Мой тип поля datetime в базе данных.dpdob мое имя элемента datepicker.

           Dim test = dpdob.Text.Replace("-", "/")
           Dim parts As String() = test.Split(New Char() {"/"c})
           Dim firstPart As String = parts(0)
           Dim thirdPart As String = parts(2)
           Dim secondPart As String = parts(1)
           Dim test1 = secondPart + "/" + firstPart + "/" + thirdPart
           Dim dob = test1

Теперь использовать DOB в свой вставить запрос.

Комментарии (0)
convert(datetime2,((SUBSTRING( ISNULL(S2.FechaReal,e.ETA),7,4)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),4,2)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),1,2) + ' 12:00:00.127')))  as fecha,
Комментарии (1)

Формат даты на самом деле, который работает на SQL сервер

yyyy-mm-dd hh:MM:ss
Комментарии (1)

Вы можете попробовать этот код

select (Convert(Date, '2018-04-01'))
Комментарии (0)

У меня была эта проблема при попытке объединить `функции getdate () в строку, которую я вставила в тип данных nvarchar поле.

Я сделал некоторые формы, чтобы обойти это:

 INSERT INTO [SYSTEM_TABLE] ([SYSTEM_PROP_TAG],[SYSTEM_PROP_VAL]) VALUES 
   (
    'EMAIL_HEADER',
    '<h2>111 Any St.<br />Anywhere, ST 11111</h2><br />' + 
        CAST(CAST(getdate() AS datetime2) AS nvarchar) + 
    '<br /><br /><br />'
   )

Что'ы подчищенный пример. Ключевую часть, которая является:

...&#39; + литой(литой(функции getdate() в качестве типа datetime2) как nvarchar) + &#39;...

Литые дату как типа datetime2, тогда как аргумент, чтобы объединить его.

Комментарии (0)

установить культуру на английском из интернета.файл config

например, если вы установите культуры на арабском этапе будет

22/09/2017 02:16:57.

и вы получаете ошибку:ошибка преобразования даты или времени из символьной строки при вставке датавремя

Комментарии (0)