преобразование типа данных 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.