在SQL Server 2008中只比较两个DATETIME,而不是date

我有两个表,其中列[date]是typesDATETIME2(0)

我必须比较两个logging只有他们的date部分(日+月+年),丢弃时间部分(小时+分钟+秒)。

我怎样才能做到这一点?

CAST用于SQL Server 2008中新的DATE数据types,以比较date部分:

 IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE) 

Marc的答案中的一个小缺点是,这两个date字段都是被强制转换的,这意味着你将无法利用任何索引。

因此,如果需要编写一个可以从date字段的索引中受益的查询,那么下面的(相当复杂的)方法是必要的。

  • 索引的date字段(称为DF1)必须不受任何types的函数影响。
  • 因此,您必须将DF1与DF2当天的全部date时间值进行比较。
  • 这是从DF2的date部分到DF2之后的date部分。
  • (DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
  • 注意 :比较是> = (等于允许)至DF2的date,并且(严格) < DF2之后的一天是非常重要的。 此外,BETWEEN运算符不起作用,因为它允许两边平等。

PS:提取date的另一种方法(在旧版本的SQL Server中)是使用内部表示date的技巧。

  • 将date转换为浮点数。
  • 截断小数部分
  • 将该值转换回date时间
  • CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)

虽然我赞成答案被标记为正确的。 我想碰碰到一些事情,让任何人磕磕碰碰。

一般来说,如果你只是单独过滤date值。 Microsoftbuild议使用ymdymd的语言中立格式。

请注意,表单“2007-02-12”仅针对数据typesDATE,DATETIME2和DATETIMEOFFSET,被认为是语言中立的。

用上述方法做date比较很简单。 考虑下面这个人为的例子。

 --112 is ISO format 'YYYYMMDD' declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112) select * from Sales.Orders where CONVERT(char(8), OrderDate, 112) = @filterDate 

在完美的世界中,应该避免对过滤列执行任何操作,因为这可能会阻止SQL Server有效地使用索引。 也就是说,如果您存储的数据只关注date而不是时间,请考虑将时间存储为DATETIME 。 因为:

当SQL Server将文字转换为过滤列的types时,它将在未指示时间部分的情况下假定为午夜。 如果您希望这样的filter从指定的date返回所有行,则需要确保您将所有值与午夜时间一起存储。

因此,假设你只关心date,并存储你的数据。 上面的查询可以简化为:

 --112 is ISO format 'YYYYMMDD' declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112) select * from Sales.Orders where OrderDate = @filterDate 

将两个date比如MM / DD / YYYYMM / DD / YYYY进行比较 。 记住第一个字段的列types必须是dateTime。 示例: columnName: payment_date dataType: DateTime

之后,你可以很容易地比较它。 查询是:

 select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'. 

这很简单……它testing了…..