比较DATETIME和DATE忽略时间部分


Answers:


252

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

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

61

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

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

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

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

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

5

虽然我赞成将答案标记为正确。我想为绊脚石的人讲几件事。

通常,如果您仅针对日期值进行过滤。微软建议使用的语言无关的格式ymdy-m-d

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

使用上述方法进行日期比较很简单。考虑下面的人为例子。

--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

你可以试试这个

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

-3

对于比较两个日期,例如MM / DD / YYYYMM / DD / YYYY 。请记住,字段的第一件事列类型必须为dateTime。示例:columnName: payment_date dataType:DateTime

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

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

非常简单……它测试了.....


这并不能完全回答问题。它查询一个月,而不是一天。
柯蒂斯·亚洛普

对于您三月份的查询:如果日期为“ 2015年3月31日”时间13:00,则将找不到该日期。您应使用<'4/1/2015'。
柯蒂斯·亚洛普

还可以考虑使用国际日期格式“ 2015-03-01”。在加拿大(以及许多其他地方),官方格式为DD / MM / YYYY,这两种格式都模棱两可且存在问题。
柯蒂斯·雅洛普

根据问题的要求,此答案不涉及2个表。
柯蒂斯·雅洛普

是的,我同意,但是我只是证明解决方案而不是国际解决方案..您必须更改某些顺序...
pankaj
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.