Ошибка преобразования даты и/или времени из символьной строки при вставке датавремя
Я пытаюсь создать таблицу следующим образом:
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));
но я все еще получаю сообщение об ошибке сказав,
ошибка преобразования дата и / или время из символьной строки
какие предложения?
12 ответов:
существует множество форматов, поддерживаемых SQL Server-см. MSDN книги онлайн на литье и конвертировать. Большинство из этих форматов зависимая на какие настройки у вас есть - поэтому эти настройки могут работать несколько раз - а иногда и нет.
способ решить эту проблему-использовать (слегка адаптированный)формат даты ISO-8601 что поддерживается SQL Server - этот формат работает всегда - независимо от вашего SQL Server язык и dateformat.
The формат 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.
преобразование в SQL server иногда не удается из-за используемых форматов даты или времени, это просто потому, что вы пытаетесь сохранить неправильные данные, которые не приемлемы для системы.
пример:
Create Table MyTable (MyDate);
Insert Into MyTable(MyDate) Values ('2015-02-29');SQL server выдаст следующую ошибку:
Conversion failed when converting date and/or time from character string.причина этой ошибки просто нет такой даты (февраль-29) В Год (2015).
простой ответ-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)будет работать.
по возможности следует избегать конкретных литералов даты/времени культуры.
есть немного безопасное форматы для предоставления даты / времени в виде литерала:
все примеры для
2016-09-15 17:30:00ODBC (мой любимый, так как он обрабатывается как реальные тип сразу)
{ts'2016-09-15 17:30:00'}--Штамп Времени{d'2016-09-15'}--Дата только{t'17:30:00'}--время толькоISO8601 (самое лучшее для везде)
'2016-09-15T17:30:00'--будьте в курсеTв середине!Unseperated (крошечный риск быть неправильно истолкованным как число)
'20160915'--только для чисто датахорошо иметь в виду: неверные даты, как правило, появляются с странные ошибки
- там нет 31 июня или 30-го февраля...
еще одна причина странных ошибок преобразования: порядок выполнения!
SQL-сервер хорошо знает, чтобы делать вещи в порядке выполнения, который можно было бы не ожидать. Ваше письменное заявление выглядит так, как будто преобразование сделано до какое - то действие, связанное с типом, происходит, но двигатель решает - почему-то-сделать преобразование на более позднем этапе.
вот отличная статья, объясняющая это с помощью примеры: Rusano.com: "т-с SQL-функций-не-не-означает-есть-то-порядок выполнения" и вот это на вопрос.
просто обновите формат даты, как показано ниже
yyyy-MM-dd hh:MM:ssэто решает проблему для меня, и он отлично работает
самый лучший способ-это код
"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"
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,
пожалуйста, попробуйте это.
SQL Server ожидает даты в формате MM/DD / YYYY,если английский язык установлен в качестве языка по умолчанию.Здесь я сохраняю значение datepicker в sql2008 database.My тип поля-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 в запросе вставки.
у меня была эта проблема при попытке объединить
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 />' )это санированный пример. Ключевой частью этого является:
...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...отлитая дата как
datetime2, тогда какnvarcharобъединить его.
установите язык и региональные параметры на английский из интернета.конфигурационный файл
<globalization uiCulture="en-US" culture="en-US" />например, если вы установите язык и региональные параметры на арабском языке thime будет
22.09.2017 02:16: 57 ص
и вы получаете ошибку:ошибка преобразования даты или времени из символьной строки при вставке датавремя
Comments