Преобразовать строку Datetime в дату в SQL Server

У меня есть данные даты и времени из С#, подобные этому

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 использовалась?

Morang 10.04.2019 08:24

как вы передаете дату в SQL из С#

peeyush singh 10.04.2019 08:26

Пропустил упомянуть.. SQL 2012

Sandeep Thomas 10.04.2019 08:26

@peeyushsingh как строка

Sandeep Thomas 10.04.2019 08:27

При отправке дат из С# в SQL Server не отправляйте строки, отправьте экземпляр структуры DateTime. Тогда вам не придется возиться с преобразованием и строковыми представлениями даты и времени.

Zohar Peled 10.04.2019 13:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
863
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы должны воспользоваться методом 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

демо на dbfiddle.uk

Проблема заключается в точности миллисекундной части вашего строкового значения. Вы используете семь цифр в миллисекундах, что невозможно в DATETIME. Итак, вы можете сделать две вещи:

  • сократите часть миллисекунд до трех цифр и используйте DATETIME
  • используйте DATETIME2 для большей точности

Use the time, date, datetime2 and datetimeoffset data types for new work. These types align with the SQL Standard. They are more portable. time, datetime2 and datetimeoffset 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...
Ответ принят как подходящий

Если вам нужна только дата, это будет работать

select cast('2019-03-20T11:25:32.0342949' as date) As DATE

Если вам нужна дата и время, это будет работать

select cast('2019-03-20T11:25:32.0342949' as datetime2) As DATE

Пробовал в Sql 15. Работает

Другие вопросы по теме