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

Я пытался создать таблицу следующим образом:

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 на CAST и CONVERT. Большинство этих форматов зависят от от того, какие настройки у вас есть, поэтому эти настройки могут работать несколько раз, а иногда и нет.

Способ решения этой проблемы - использовать (слегка адаптированный) формат ISO-8601, поддерживаемый SQL Server - этот формат работает всегда - независимо от вашего SQL Server и настройки даты и времени.

Формат ISO-8601 поддерживается SQL Server в двух вариантах:

  • YYYYMMDD только для дат (без временной части); обратите внимание здесь: нет тире!, это очень важно! YYYY-MM-DD НЕ не зависит от параметров dateformat на вашем SQL Server и будет НЕ работать во всех ситуациях!

или

  • YYYY-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 и для любого языка и параметра dateformat на вашем SQL Server.

Ответ 2

Простой ответ - 5 - итальянский "yy", а 105 - итальянский "yyyy". Поэтому:

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)

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

Ответ 3

Преобразование на сервере SQL иногда происходит не из-за использования форматов даты или времени. Это просто потому, что вы пытаетесь сохранить неверные данные, которые неприемлемы для системы.

Пример:

Create Table MyTable (MyDate);

Insert Into MyTable(MyDate) Values ('2015-02-29');

Сервер SQL выдает следующую ошибку:

Conversion failed when converting date and/or time from character string.

Причиной этой ошибки является просто отсутствие такой даты (фев-29) в году (2015).

Ответ 4

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

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

Все примеры для 2016-09-15 17:30:00

ODBC (мой любимый, поскольку он обрабатывается как реальный тип немедленно)

  • {ts'2016-09-15 17:30:00'} - штамп времени
  • {d'2016-09-15'} - только дата
  • {t'17:30:00'} - Только время

ISO8601 (лучший для всех)

  • '2016-09-15T17:30:00' - знать о T посередине!

Непроизносимый (крошечный риск ошибиться в качестве числа)

  • '20160915' - только для чистой даты

Приятно иметь в виду: неверные даты имеют тенденцию появляться со странными ошибками

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

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

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

Вот отличная статья, объясняющая это примерами: Rusano.com: "t-sql-functions-do-no-imply-a-certain- порядок выполнения" и вот связанный вопрос.

Ответ 5

лучшим способом является этот код

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"

Ответ 6

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,

Ответ 7

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

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

           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 в вашем запросе на вставку.

Ответ 8

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

yyyy-MM-dd hh:MM:ss

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

Ответ 9

Формат даты и времени, который выполняется на сервере sql,

yyyy-mm-dd hh:MM:ss

Ответ 10

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

  <globalization uiCulture="en-US" culture="en-US" />

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

22/09/2017 02:16:57 ص

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