преобразование типа данных varchar в тип данных datetime в результате вне диапазона значение

У меня есть следующий фрагмент встроенного SQL, который я запускаю из службы windows c#:

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 из приложения, я получаю следующую ошибку:

6 ответов


неоднозначные форматы даты интерпретируются в соответствии с языком входа в систему. Это работает

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


но если я возьму кусок sql и запущу его из SQL management studio, он будет работать без проблем.

Если вы свободны, измените учетную запись службы на свой собственный логин, который унаследует ваши языковые/региональные характеристики.

суть вопроса:

Я использую следующее Для преобразования - > дата.Значение.ToString ("MM/dd/гггг чч:мм:СС")

пожалуйста, начните использовать параметризованные запросы что вы не столкнетесь с этими проблемами в будущем. Она также является более надежной, предсказуемой и передовой практикой.


Я думаю, что лучший способ работать с датами между C# и SQL, конечно, использовать параметризованные запросы и всегда работать с объектами DateTime на C# и параметрами формирования ToString (), которые он предоставляет.

Вам лучше выполнить set datetime <format> (здесь у вас есть объяснение set dateformat на MSDN) перед работой с датами на SQL Server, чтобы у вас не было проблем, например set datetime ymd. Вам нужно сделать это только один раз за соединение, потому что он поддерживает формат открыть, поэтому хорошей практикой было бы сделать это сразу после открытия соединения с базой данных.
Затем вы всегда можете работать с форматами' yyyy-MM-dd HH:mm:ss:ffff'.

Для передачи объекта DateTime в параметризованный запрос можно использовать DateTime.ToString('yyyy-MM-dd HH:mm:ss:ffff').

Для разбора странных форматированных дат на C# вы можете использовать DateTime.ParseExact() метод, где у вас есть возможность точно указать, что такое формат ввода:DateTime.ParseExact(<some date string>, 'dd/MM-yyyy',CultureInfo.InvariantCulture). здесь у вас есть DateTime.ParseExact () объяснение на В MSDN)


это проблема формата даты. В Ирландии стандартным форматом даты 28 марта будет "28-03-2011", в то время как "03/28/2011" является стандартом для США (среди многих других).


Я знаю, что это решение немного отличается от случая OP, но поскольку вы, возможно, были перенаправлены сюда из поиска в google название этого вопроса, как и я, возможно, вы столкнулись с той же проблемой, что и я.
Иногда вы получаете эту ошибку, потому что ваше время даты недействительно, т. е. ваша дата (в строковом формате) указывает на день, который превышает количество дней этого месяца! например: CONVERT(Datetime, '2015-06-31') вызвал у меня эту ошибку, когда я преобразовывал оператор из MySql (который не спорил! и делает ошибку действительно сложнее поймать) на SQL Server.


JAVA8: используйте LocalDateTime.теперь.)(toString ()