2009-12-03 114 views

回答

200

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

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

我认为你的意思=而非==。 – GilM 2009-12-03 22:29:28

+2

@GilM:当然! ;-)今天C#太多;-) – 2009-12-03 22:29:59

53

在马克的回答一个小缺点是,无论datefields已强制转换,这意味着你会无法利用任何指标。

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

  • 索引的datefield(称为DF1)必须不受任何类型的函数影响。
  • 因此,您必须将DF1与DF2当日的全部日期时间值进行比较。
  • 这是从DF2的日期部分到DF2后一天的日期部分。
  • I.e. (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)
-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'. 

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

+0

这并不完全回答这个问题。它查询一个月,而不是一天。 – 2016-07-21 21:16:43

+0

对于您的March查询:如果日期是'3/31/2015'时间13:00,则不会被找到。你应该使用<'4/1/2015'。 – 2016-07-21 21:16:49

+0

也考虑使用国际日期格式'2015-03-01'。在加拿大(和许多其他地方),官方格式是DD/MM/YYYY,这使得两种格式都不明确并且存在问题。 – 2016-07-21 21:20:20

3

虽然我upvoted答案标记为正确的。我想谈谈一些让这个问题困扰的人的事情。

一般情况下,如果您仅在日期值过滤。 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 
0

你可以试试这个

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