Select * from [User] U
where U.DateCreated = '2014-02-07'
но в базе данных пользователь был создан на 2014-02-07 12:30:47.220
и когда я только ставил '2014-02-07'
Он не показывает никаких данных
Select * from [User] U
where U.DateCreated = '2014-02-07'
но в базе данных пользователь был создан на 2014-02-07 12:30:47.220
и когда я только ставил '2014-02-07'
Он не показывает никаких данных
Не поддавайтесь искушению делать такие вещи:
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 (Ицик Бен-Ган)
Если вы используете SQL Server 2008 или более позднюю версию, вы можете использовать тип данных даты:
SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2014-02-07'
Следует отметить, что если индексировать столбец даты, это все равно будет использовать индекс и SARGable. Это особый случай для дат и времени.
Вы можете видеть, что SQL Server фактически превращает это в > и < раздел:
Я только что попробовал это на большой таблице со вторичным индексом в столбце даты в соответствии с комментариями @kobik и индекс все еще используется, это не относится к примерам, использующим BETWEEN или >= и <;
SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2016-07-05'
По вашему запросу 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'
.
Конечно, это старая тема, но для ее завершения.
В SQL 2008 вы можете использовать тип данных DATE, так что вы можете просто сделать:
SELECT CONVERT(DATE,GETDATE())
OR
Select * from [User] U
where CONVERT(DATE,U.DateCreated) = '2014-02-07'
Вы можете использовать инструкцию LIKE
вместо =
. Но для этого с DateStamp вам нужно CONVERT
сначала сначала VARCHAR:
SELECT *
FROM [User] U
WHERE CONVERT(VARCHAR, U.DateCreated, 120) LIKE '2014-02-07%'
Попробуйте это. Этот запрос может использоваться для сравнения даты
select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'