Подтвердить что ты не робот

Преобразование типа данных 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, он будет работать без проблем.

Любые идеи, которые могут вызывать эту проблему?

4b9b3361

Ответ 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 решение было положить в этом формате: = дата ('м-д-ч ч: м: с'); скорее, чем = дата ('у-м-д ч: м: с');