Как сравнить дату и время с датой в 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 (или в условиях соединения).
- В большинстве случаев использование функции данных для фильтрации или объединения лишает оптимизатор возможности доступа к индексу в этом поле, что делает запрос медленнее (или более "дорогостоящим")
- С другой стороны, для каждой строки данных выполняется, по крайней мере, одно вычисление. Это может быть добавление к запросу сотен, тысяч или многих миллионов вычислений, чтобы мы могли сравнить их с одним критерием, например
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'