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



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



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));


но я все еще получаю сообщение об ошибке сказав,




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




какие предложения?

7953   12  

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:00

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

  • {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 в запросе вставки.

формат datetime на самом деле работает на sql server

yyyy-mm-dd hh:MM:ss

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

select (Convert(Date, '2018-04-01'))

у меня была эта проблема при попытке объединить 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

    Ничего не найдено.