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')
编辑 +
2014-02-07
)进行比较。更有效的方法是修改标准以适应数据。“根据数据修改标准”是我描述“使用SARGABLE
谓词”的方式
也不要使用between。
处理日期和时间范围的最佳实践是避免使用BETWEEN,并始终使用以下形式:
WHERE col >= '20120101' AND col < '20120201'。该形式适用于所有类型和所有精度,无论时间部分是否适用。
http://sqlmag.com/t-sql/t-sql-best-practices-part-2(Itzik Ben-Gan)
如果您使用的是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'
2014-02-07 12:30:47.220
和2014-02-07 00:00:00.000
是否相等)。这就是比较结果为false的原因。因此,在比较日期时,您需要考虑时间。您可以使用Select * from [User] U where U.DateCreated BETWEEN '2014-02-07' AND '2014-02-08'
。between
是可以的。你提出的使用 >=
和 <
比 between
更可取,用于日期范围。我只想说,在比较日期时,我们也应考虑时间。 - imdzeeshanSELECT CONVERT(DATE,GETDATE())
OR
Select * from [User] U
where CONVERT(DATE,U.DateCreated) = '2014-02-07'
select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
您可以使用LIKE
语句代替=
。但是,如果要对DateStamp执行此操作,则需要先将其转换为VARCHAR:CONVERT
。
SELECT *
FROM [User] U
WHERE CONVERT(VARCHAR, U.DateCreated, 120) LIKE '2014-02-07%'
CAST
会从优化器中删除索引,此外,答案中指出的第二个原因在处理大型数据集时可能会很麻烦。 - Serpiton