165

我有两个表,其中列[date]的类型为DATETIME2(0).

我必须仅按日期部分(日+月+年)比较两条记录,丢弃时间部分(小时+分钟+秒)。

我怎样才能做到这一点?

4

6 回答 6

279

使用SQL Server 2008 中CAST的新数据类型来仅比较日期部分:DATE

IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)
于 2009-12-03T22:24:32.577 回答
63

Marc 回答中的一个小缺点是两个日期字段都已进行类型转换,这意味着您将无法利用任何索引。

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

  • 索引的日期字段(称为 DF1)必须不受任何功能的影响。
  • 因此,您必须将 DF1 与 DF2 当天的全部日期时间值进行比较。
  • 即从 DF2 的日期部分到 DF2 之后的日期部分。
  • IE(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
  • 注意:非常重要的是,比较>=(允许相等)到 DF2 的日期,并且(严格)< DF2 之后的一天。BETWEEN 运算符也不起作用,因为它允许双方相等。

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

  • 将日期转换为浮点数。
  • 截断小数部分
  • 将值转换回日期时间
  • IECAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
于 2009-12-04T17:27:13.430 回答
6

尽管我赞成标记为正确的答案。我想为遇到此问题的任何人谈谈一些事情。

通常,如果您仅针对Date值进行过滤。Microsoft 建议使用ymdor的语言中性格式y-m-d

请注意,“2007-02-12”形式仅对数据类型 DATE、DATETIME2 和 DATETIMEOFFSET 被视为与语言无关。

使用上述方法进行日期比较很简单。考虑以下人为设计的示例。

--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 有效地使用索引。也就是说,如果您存储的数据只与日期而不是时间有关,请考虑将DATETIME午夜存储为时间。因为:

当 SQL Server 将文字转换为筛选列的类型时,它假定没有指示时间部分的午夜。如果您希望这样的过滤器从指定日期返回所有行,则需要确保存储所有以午夜为时间的值。

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

--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)

select 
    * 
from 
    Sales.Orders
where
    OrderDate = @filterDate
于 2017-03-03T21:22:04.263 回答
4

你可以试试这个

CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000')

我通过以下代码测试 MS SQL 2014

select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok'
            else '' end
于 2017-11-16T15:04:45.463 回答
1

您可以DateDiff按天使用和比较。

DateDiff(dd,@date1,@date2) > 0

它的意思是@date2 > @date1

例如 :

select DateDiff(dd, '01/01/2021 10:20:00', '02/01/2021 10:20:00') 

结果:1

于 2021-01-13T12:55:19.347 回答
-3

对于将 MM/DD/YYYY 等两个日期与MM/DD/YYYY进行比较 。请记住,字段的第一件事列类型必须是日期时间。示例:columnName: payment_date dataType:DateTime

之后,您可以轻松比较它。查询是:

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

它很简单......它测试它......

于 2015-06-13T14:35:27.357 回答