Select * from [User] U
where U.DateCreated = '2014-02-07'
但是在数据库中,用户是在2014-02-07 12:30:47.220
上创建的,当我只放'2014-02-07'
时
它不显示任何数据
答案 0 :(得分:68)
不要试图做这样的事情:
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
谓词”的方式
不要在两者之间使用。
日期和时间范围的最佳做法是避免BETWEEN和 总是使用表格:
WHERE col&gt; ='20120101'AND col&lt; '20120201'此表单适用于所有人 类型和所有精度,无论时间部分是什么 适用。
http://sqlmag.com/t-sql/t-sql-best-practices-part-2(Itzik Ben-Gan)
答案 1 :(得分:54)
如果您使用的是SQL Server 2008或更高版本,则可以使用日期数据类型:
SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2014-02-07'
应该注意的是,如果将日期列编入索引,那么它仍将使用索引并且是SARGable。这是日期和日期时间的特例。
您可以看到SQL Server实际上将其转换为&gt;和&lt;子句:
我刚刚在一个大表上尝试了这个,根据@ kobik的注释在日期列上有一个二级索引,并且仍然使用索引,对于使用BETWEEN或&gt; =的示例不是这种情况&LT;:
SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2016-07-05'
答案 2 :(得分:2)
根据您的疑问
Select * from [User] U where U.DateCreated = '2014-02-07'
SQL Server正在比较确切的日期和时间,即(将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'
。
答案 3 :(得分:0)
当然这是一个旧线程,但要使其完整。
在SQL 2008中,您可以使用DATE数据类型,因此只需执行以下操作:
SELECT CONVERT(DATE,GETDATE())
OR
Select * from [User] U
where CONVERT(DATE,U.DateCreated) = '2014-02-07'
答案 4 :(得分:-2)
您可以使用LIKE
语句代替=
。但要使用DateStamp执行此操作,您需要CONVERT
首先使用VARCHAR:
SELECT *
FROM [User] U
WHERE CONVERT(VARCHAR, U.DateCreated, 120) LIKE '2014-02-07%'
答案 5 :(得分:-2)
请试试这个。此查询可用于日期比较
select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'