比较DATETIME和DATE忽略时间部分

By simon at 2018-02-07 • 0人收藏 • 57人看过

我有两个表,其中列[date]是类型DATETIME2(0)。 我必须比较两个记录只有他们的日期部分(天+月+年), 丢弃时间部分(小时+分钟+秒)。 我怎样才能做到这一点?

6 个回复 | 最后更新于 2018-02-07
2018-02-07   #1

使用CAST来将SQL Server 2008中的新数据类型DATE更改为 只比较日期部分:

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

2018-02-07   #2

使用CAST来将SQL Server 2008中的新数据类型DATE更改为 只比较日期部分:

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

2018-02-07   #3

马克的答案的一个小缺点是,两个日期字段都是一致的, 这意味着你将无法利用任何索引。所以,如果需要编写一个可以从一个索引获益的查询 日期字段,那么下面(相当复杂)approach是必要的。   索引的日期字段(称为DF1)必须不受任何类型的函数影响。   所以你必须compDF1是DF2当日的全部日期时间值。   这是从DF2的日期部分,到日期部分DF2后一天。    I.e. (DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))   * 注意:比较是> = *(允许相等)是非常重要的DF2的日期,以及(严格地) <DF2后的一天。此外,BETWEEN运算符不起作用,因为它允许两者均等两侧。 PS:另一种只提取日期的方法(在旧版本的SQL中 服务器)是使用日期repr的技巧内部提供。   将日期转换为浮动。   截断小数部分   将这个值转换回日期时间    I.e. CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)

2018-02-07   #4

用于比较* MM / DD / YYYY MM / DD / YYYY 这两个日期。首先记住 字段的东西列类型必须是dateTime。例:列名: _payment_date_ dataType:_DateTime_。* 之后,你可以很容易地比较它。查询是:

select  *  from demo_date where date >= '3/1/2015' and date <=  '3/31/2015'.
非常简单......它测试了.....

2018-02-07   #5

虽然我赞成答案被标记为正确的。我想谈谈几个 任何人都可以绊倒这一点。 一般来说,如果你只是在* Date *值上进行过滤。 Microsoft建议使用ymd o的语言中性格式[R 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服务器有效地使用索引。 这就是说,如果你正在存储的数据只关心日期和 不是时间,考虑以午夜为时间存储为DATETIME。 因为: 当SQL Server将文字转换为过滤后的column的类型 假定没有指示时间部分是午夜。如果你想要这样一个过滤器 返回指定的所有行编辑日期,你需要确保你存储 所有值与午夜时间。 因此,假设你只关心日期,并存储您的数据。 上面的查询可以简化为:
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)

select 
    * 
from 
    Sales.Orders
where
    OrderDate = @filterDate

2018-02-07   #6

你可以试试这个

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

登录后方可回帖

Loading...