У меня есть данные даты и времени из С#, подобные этому
2019-03-20T11:25:32.0342949
Я попытался преобразовать его в дату и время с помощью приведения, и это вызывает ошибку
select cast('2019-03-20T11:25:32.0342949' as date)
Conversion failed when converting date and/or time from character string.
Я думаю, это из-за T
в строке.
Я также попробовал формат, который, конечно, не работает, потому что он не идентифицирует его как дату.
Итак, как я могу преобразовать его правильно на сегодняшний день. Без некоторых методов подстроки для извлечения части даты.
как вы передаете дату в SQL из С#
Пропустил упомянуть.. SQL 2012
@peeyushsingh как строка
При отправке дат из С# в SQL Server не отправляйте строки, отправьте экземпляр структуры DateTime
. Тогда вам не придется возиться с преобразованием и строковыми представлениями даты и времени.
Вы должны воспользоваться методом CONVERT(). Например, SELECT CONVERT(date, getdate())
, где date
— строка, которую вы только что упомянули. В вашем случае ваша строка datetime
занимает 10 букв строки, поэтому вы также можете сделать SELECT CONVERT(VARCHAR(10), GETDATE(), 103)
. Третий параметр — это стиль datetime
, в который вы хотите преобразовать.
Вы должны использовать DATETIME2
вместо DATETIME
:
SELECT CAST('2019-03-20T11:25:32.0342949' AS DATETIME2) -- 2019-03-20 11:25:32.0342949
Проблема заключается в точности миллисекундной части вашего строкового значения. Вы используете семь цифр в миллисекундах, что невозможно в DATETIME
. Итак, вы можете сделать две вещи:
DATETIME
DATETIME2
для большей точностиUse the
time
,date
,datetime2
anddatetimeoffset
data types for new work. These types align with the SQL Standard. They are more portable.time
,datetime2
anddatetimeoffset
provide more seconds precision.datetimeoffset
provides time zone support for globally deployed applications.
source:https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql
Также есть сравнение между DATETIME
и DATETIME2
на StackOverflow:
DateTime2 против DateTime в SQL Server
Вы не должны передавать дату и время как строку из С#, это правильный способ передачи:
string sql = "SELECT * FROM table WHERE datevalue= @date";
SqlParameter dateParam = new SqlParameter("@date", SqlDbType.DateTime);
dateParam .Value = dateValue;
SqlCommand command = new SqlCommand(sql);
command.Parameters.AddWithValue("@date", dateParam );
// then execute the command...
Какая версия SQL использовалась?