Как сравнить дату и время с датой в SQL Server

Select * from [User] U
where  U.DateCreated = '2014-02-07'     

но в базе данных пользователь был создан на 2014-02-07 12:30:47.220 и когда я только ставил '2014-02-07'

Он не показывает никаких данных

Ответ 1

Не поддавайтесь искушению делать такие вещи:

Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'

Это лучший способ:

Select * from [User] U 
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')

см.: Что на самом деле означает слово "SARGable"?

ОБНОВЛЕНИЕ + Существует две фундаментальные причины, по которым следует избегать использования функций для данных в предложении where (или в условиях соединения).

  1. В большинстве случаев использование функции данных для фильтрации или объединения лишает оптимизатор возможности доступа к индексу в этом поле, что делает запрос медленнее (или более "дорогостоящим")
  2. С другой стороны, для каждой строки данных выполняется, по крайней мере, одно вычисление. Это может быть добавление к запросу сотен, тысяч или многих миллионов вычислений, чтобы мы могли сравнить их с одним критерием, например 2014-02-07. Вместо этого гораздо эффективнее изменить критерии в соответствии с данными.

"Изменение критериев для соответствия данным" - это мой способ описания "использования предикатов SARGABLE"


И не используйте между ними.

Лучшая практика с диапазонами даты и времени - избегать МЕЖДУ и всегда используйте форму:

ГДЕ col> = '20120101' И col & lt; '20120201' Эта форма работает со всеми типы и все точности, независимо от того, является ли часть времени применимо.

http://sqlmag.com/t-sql/t-sql-best-practices-part-2  (Ицик Бен-Ган)

Ответ 2

Если вы используете SQL Server 2008 или более позднюю версию, вы можете использовать тип данных даты:

SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2014-02-07'

Следует отметить, что если индексировать столбец даты, это все равно будет использовать индекс и SARGable. Это особый случай для дат и времени.

enter image description here

Вы можете видеть, что SQL Server фактически превращает это в > и < раздел:

введите описание изображения здесь

Я только что попробовал это на большой таблице со вторичным индексом в столбце даты в соответствии с комментариями @kobik и индекс все еще используется, это не относится к примерам, использующим BETWEEN или >= и <;

SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2016-07-05'

показывая использование индекса со вторичным индексом

Ответ 3

По вашему запросу   Select * from [User] U where U.DateCreated = '2014-02-07'

SQL Server сравнивает точную дату и время i.e(сравнение 2014-02-07 12:30:47.220 с 2014-02-07 00:00:00.000 для равенства). почему результат сравнения неверен

Поэтому, сравнивая даты, вам также нужно учитывать время. Вы можете использовать    Select * from [User] U where U.DateCreated BETWEEN '2014-02-07' AND '2014-02-08'.

Ответ 4

Конечно, это старая тема, но для ее завершения.

В SQL 2008 вы можете использовать тип данных DATE, так что вы можете просто сделать:

SELECT CONVERT(DATE,GETDATE())

OR

Select * from [User] U
where  CONVERT(DATE,U.DateCreated) = '2014-02-07' 

Ответ 5

Вы можете использовать инструкцию LIKE вместо =. Но для этого с DateStamp вам нужно CONVERT сначала сначала VARCHAR:

SELECT * 
FROM [User] U
WHERE CONVERT(VARCHAR, U.DateCreated, 120) LIKE '2014-02-07%'

Ответ 6

Попробуйте это. Этот запрос может использоваться для сравнения даты

select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'