比较DATETIME和DATE忽略时间部分

时间:2009-12-03 22:22:17

标签: sql sql-server tsql sql-server-2008 datetime-conversion

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

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

我该怎么做?

6 个答案:

答案 0 :(得分:230)

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

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

答案 1 :(得分:58)

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

因此,如果需要编写可以从日期字段上的索引中受益的查询,则需要采用以下(相当复杂的)方法。

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

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

  • 将日期转换为浮动。
  • 截断小数部分
  • 将值转换回日期时间
  • 即。 CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)

答案 2 :(得分:4)

虽然我赞成标记为正确的答案。对于任何绊倒这个的人,我想谈谈一些事情。

一般情况下,如果您仅针对日期值进行过滤。 Microsoft建议使用ymdy-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

答案 3 :(得分:1)

你可以尝试这个

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

答案 4 :(得分: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

答案 5 :(得分:-3)

比较两个日期,如 MM / DD / YYYY MM / DD / YYYY 。 记住Field的列类型必须是dateTime。 示例: columnName: payment_date dataType: DateTime

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

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

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