如何将日期时间与SQL Server中的日期进行比较

时间:2014-08-29 08:29:51

标签: sql sql-server tsql datetime

Select * from [User] U
where  U.DateCreated = '2014-02-07'     

但是在数据库中,用户是在2014-02-07 12:30:47.220上创建的,当我只放'2014-02-07'

它不显示任何数据

6 个答案:

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

  1. 在大多数情况下,使用数据函数进行过滤或连接会删除优化程序访问该字段索引的能力,从而使查询更慢(或更“昂贵”)
  2. 另一种是,对于涉及的每行数据,至少执行一次计算。这可能会为查询添加数百,数千或数百万的计算,以便我们可以比较2014-02-07这样的单一条件。改变标准以适应数据的效率要高得多。
  3. “修改标准以适应数据”是我描述“使用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。这是日期和日期时间的特例。

enter image description here

您可以看到SQL Server实际上将其转换为&gt;和&lt;子句:

enter image description here

  

我刚刚在一个大表上尝试了这个,根据@ kobik的注释在日期列上有一个二级索引,并且仍然使用索引,对于使用BETWEEN或&gt; =的示例不是这种情况&LT;:

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

showing index usage with secondary index

答案 2 :(得分:2)

根据您的疑问     Select * from [User] U where U.DateCreated = '2014-02-07'

SQL Server正在比较确切的日期和时间,即(将2014-02-07 12:30:47.2202014-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'