首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较DATETIME和DATE忽略时间部分

问比较DATETIME和DATE忽略时间部分
EN

Stack Overflow用户
提问于 2009-12-04 06:22:17
回答 6查看 277.1K关注 0票数 163

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

我只能通过丢弃时间部分(hours+minutes+seconds)和日期部分(day+month+year)来比较两个记录。

我该怎么做呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-12-04 06:24:33

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

代码语言:javascript
复制
IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)
票数 276
EN

Stack Overflow用户

发布于 2009-12-05 01:27:13

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

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

  • 索引日期字段(称为DF1)必须不被任何类型的函数触及。
  • 因此,您必须将DF1与DF2日期的整个日期时间值范围进行比较。
  • 是从DF2的日期部分到DF2之后的日期部分。
  • 例如(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
  • NOTE:非常重要的一点是,比较是>=E214(允许相等)到DF2的日期,并且(严格地)比较<代码>E115<<代码>E216DF2之后的一天。此外,BETWEEN运算符也不起作用,因为它允许两端相等。

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

小数部分

  • 将日期转换为datetime

  • I.e. CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)

小数部分

  • 将值转换回float.

  • Truncate
票数 62
EN

Stack Overflow用户

发布于 2017-03-04 05:22:04

尽管我把被标记为正确的答案往上推了。我想对那些偶然发现这一点的人说几件事。

通常情况下,如果您专门针对Date值进行过滤。微软建议使用ymd或y-m-d的非特定语言格式。

注意,'2007-02-12‘格式仅对于DATE、DATETIME2和DATETIMEOFFSET数据类型被认为是语言无关的。

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

代码语言:javascript
复制
--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将文字转换为筛选列的类型时,如果未指定时间部分,则假定为午夜。如果希望这样的筛选器返回指定日期的所有行,则需要确保以午夜作为时间存储所有值。

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

代码语言:javascript
复制
--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)

select 
    * 
from 
    Sales.Orders
where
    OrderDate = @filterDate
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1843395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档