Ошибка конверсии при преобразовании даты и/или времени из символьной строки при вставке даты и времени
Я пытался создать таблицу следующим образом:
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 ص
и вы получите сообщение об ошибке: Ошибка конверсии при преобразовании даты и/или времени из символьной строки при вставке даты и времени