如何将date时间与SQL Server中的唯一date进行比较

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子句(或连接条件)中使用数据的函数有两个基本原因。

  1. 在大多数情况下,使用数据上的函数进行过滤或join,会消除优化程序访问该字段上的索引的能力,从而使查询速度变慢(或“成本更高”)
  2. 另一个是,对于涉及的每一行数据,至less执行一个计算。 这可能会增加数百,数千或数百万计算到查询,以便我们可以比较2014-02-07单一标准。 改变标准以适应数据要更有效率。

“修改标准以适应数据”是我描述“使用SARGABLE谓词”的方式


而且两者之间也不要使用。

date和时间范围的最佳做法是避免BETWEEN,并始终使用以下格式:

WHERE col> ='20120101'AND col <'20120201'这个表单适用于所有types和所有精度,不pipe时间部分是否适用。

http://sqlmag.com/t-sql/t-sql-best-practices-part-2(Itzik Ben-Gan)

如果您使用SQL Server 2008或更高版本,则可以使用date数据types:

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

应该指出,如果date列索引,那么这仍然会利用索引和SARGable。 这是date和date时间的特殊情况。

在这里输入图像描述

你可以看到SQL Server实际上把它变成了一个>和<子句:

在这里输入图像描述

我刚刚在一个大表上尝试了这个,在date列上有一个二级索引,依据@ 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正在比较确切的date和时间,即(比较2014-02-07 12:30:47.2202014-02-07 00:00:00.000是否相等)。 这就是为什么比较结果是错误的

因此,在比较date时,您还需要考虑时间。 您可以使用
Select * from [User] U where U.DateCreated BETWEEN '2014-02-07' AND '2014-02-08'

请试试这个。 这个查询可以用于date比较

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

您可以使用LIKE语句而不是= 。 但是要使用DateStamp执行此操作,需要先将其CONVERT为VARCHAR:

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