比较 DATETIME 和 DATE 忽略时间部分

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

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

我该怎么做?

293582 次浏览

在 SQLServer2008中,使用 CAST与新的 DATE数据类型比较日期部分:

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

Marc 的回答有一个小缺点,那就是这两个日期字段都被定型了,这意味着您将无法利用任何索引。

因此,如果需要编写能够从日期字段的索引中获益的查询,那么就需要采用以下(相当复杂的)方法。

  • 索引的 datefield (称为 DF1)必须不能被任何类型的函数触及。
  • 因此,您必须将 DF1与 DF2当天的所有日期时间值进行比较。
  • 这是从日期-DF2的一部分,到日期-DF2之后一天的一部分。
  • 也就是 (DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
  • 注意 : 与 DF2日期的 >=(允许等式)和(严格地) DF2后一天的 < 进行比较是非常重要的。此外,因为允许两边相等,所以 BETWEEN 运算符也无法工作。

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

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

比较两个日期,比如 MM/DD/YYYYMM/DD/YYYY。 记住,Field 的首要列类型必须是 dateTime。 示例: < strong > column nName: 付款日期 dataType: 日期时间

然后你就可以很容易地比较了。 问题是:

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

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

虽然我支持标记为正确的答案。我想为偶然发现这个的人提供一些东西。

一般来说,如果只是针对 日期值进行过滤,那么。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

在理想情况下,应该避免对筛选列执行任何操作,因为这可能会妨碍 SQLServer 有效地使用索引。也就是说,如果您正在存储的数据只与日期有关,而不是时间,那么可以考虑以 DATETIME的形式存储,并将午夜作为时间。因为:

当 SQLServer 将文本转换为筛选列的类型时,它将 假设午夜时间部分没有指示。如果您想要这样一个 过滤器来返回指定日期之后的所有行,则需要确保 你把所有的值都存储在午夜作为时间。

因此,假设您只关心日期,并以这种方式存储数据。以上查询可简化为:

--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)


select
*
from
Sales.Orders
where
OrderDate = @filterDate

你可以试试这个

CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000')

我通过以下代码测试 MSSQL2014

select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok'
else '' end

您可以使用 DateDiff并在白天进行比较。

DateDiff(dd,@date1,@date2) > 0

意思是 @date2 > @date1

例如:

select DateDiff(dd, '01/01/2021 10:20:00', '02/01/2021 10:20:00')

结果是: 1