Преобразование типа данных varchar в тип данных datetime привело к внеуровневому значению
У меня есть следующий кусок встроенного SQL, который я запускаю из службы Windows С#:
UPDATE table_name SET
status_cd = '2',
sdate = CAST('03/28/2011 18:03:40' AS DATETIME),
bat_id = '33acff9b-e2b4-410e-baaf-417656e3c255',
cnt = 1,
attempt_date = CAST('03/28/2011 18:03:40' AS DATETIME)
WHERE id = '1855'
Когда я запускаю это в базе данных SQL Server из приложения, я получаю следующую ошибку:
System.Data.SqlClient.SqlException: преобразование типа данных varchar в тип данных datetime привело к значению вне диапазона. Заявление завершено.
Но если я возьму кусок SQL и запустил его из SQL Management Studio, он будет работать без проблем.
Любые идеи, которые могут вызывать эту проблему?
Ответы
Ответ 1
Неопределенные форматы даты интерпретируются в соответствии с языком входа. Это работает
set dateformat mdy
select CAST('03/28/2011 18:03:40' AS DATETIME)
Это не
set dateformat dmy
select CAST('03/28/2011 18:03:40' AS DATETIME)
Если вы используете параметризованные запросы с правильным типом данных, вы избегаете этих проблем. Вы также можете использовать недвусмысленный формат "unseparated" yyyyMMdd hh:mm:ss
Ответ 2
Но если я возьму кусок sql и запустил его из студии управления sql, он будет работать без проблем.
Если вы свободны, измените учетную запись службы на свой собственный логин, который наследует ваши языковые/региональные данные.
Реальная проблема:
Я использую следующее для преобразования → date.Value.ToString( "MM/dd/yyyy HH: mm: ss" )
Пожалуйста, начните использовать параметризованные запросы, чтобы в будущем вы не столкнетесь с этими проблемами. Это также более надежная, предсказуемая и лучшая практика.
Ответ 3
Я думаю, что лучший способ работать с датами между С# и SQL - это, конечно, использование параметризованных запросов и всегда работать с объектами DateTime на С# и параметрами форматирования ToString(), которые он предоставляет.
Вам лучше выполнить set datetime <format>
(здесь, у вас есть заданное описание даты в MSDN), прежде чем работать с датами на SQL Server, чтобы вы не попадали в неприятности, например, set datetime ymd
. Вам нужно всего лишь сделать это один раз за соединение, потому что он поддерживает формат при открытии, поэтому хорошей практикой было бы сделать это сразу после открытия соединения с базой данных.
Затем вы всегда можете работать с форматами "yyyy-MM-dd HH: mm: ss: ffff".
Чтобы передать объект DateTime в ваш параметризованный запрос, вы можете использовать DateTime.ToString('yyyy-MM-dd HH:mm:ss:ffff')
.
Для синтаксического анализа странных отформатированных дат на С# вы можете использовать метод DateTime.ParseExact()
, где у вас есть возможность точно указать, что такое формат ввода: DateTime.ParseExact(<some date string>, 'dd/MM-yyyy',CultureInfo.InvariantCulture)
. Здесь у вас есть объяснение DateTime.ParseExact() в MSDN)
Ответ 4
Это вопрос формата даты. В Ирландии стандартный формат даты для 28 марта будет "28-03-2011", тогда как "28.03.2011" является стандартом для США (среди многих других).
Ответ 5
Я знаю, что это решение немного отличается от случая OP, но поскольку вы, возможно, были перенаправлены здесь из поиска в google название этого вопроса, как и я, возможно, вы столкнулись с той же проблемой, что и я.
Иногда вы получаете эту ошибку, потому что ваше время недействительно, т.е. Ваша дата (в строчном формате) указывает на день, который превышает количество дней этого месяца!
например: CONVERT(Datetime, '2015-06-31')
вызвала у меня эту ошибку, в то время как я преобразовал инструкцию из MySql (которая не утверждала! и затрудняет ошибку) SQL Server.
Ответ 6
JAVA8: используйте LocalDateTime.now(). ToString()
Ответ 7
я столкнулся с этой проблемой, где я использовал SQL, он отличается от MYSQL
решение было положить в этом формате:
= дата ('м-д-ч ч: м: с');
скорее, чем
= дата ('у-м-д ч: м: с');