关于sql:比较DATETIME和DATE忽略时间部分

Compare DATETIME and DATE ignoring time portion

我有两个表WHERE column [date]DATETIME2(0)类型。

我只想把他们两个在约会记录部件(日+月+年)discarding时间(小时,分钟,秒+配件+)。

我该如何做?


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

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

Marc回答的一个小缺点是两个日期字段都已被排版,这意味着您将无法利用任何索引。

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

  • 索引日期字段(称为df1)必须不受任何类型的函数的影响。
  • 因此,您必须将df1与df2当天的日期时间值的完整范围进行比较。
  • 这是从df2的日期部分到df2之后一天的日期部分。
  • (DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
  • 注:非常重要的一点是,比较是>=(允许相等)到df2的日期,并且(严格地)

ps:另一种仅提取日期的方法(在旧版本的SQL Server中)是使用一个技巧,说明如何在内部表示日期。

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


尽管我投了反对票,但答案是正确的。我想为任何一个跌跌撞撞的人谈一些事情。

一般来说,如果您只是专门过滤日期值。微软建议使用与语言无关的ymdy-m-d格式。

Note that the form '2007-02-12' is considered language-neutral only
for the data types DATE, DATETIME2, and DATETIMEOFFSET.

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

1
2
3
4
5
6
7
8
9
--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,以午夜为时间。因为:

When SQL Server converts the literal to the filtered column’s type, it
assumes midnight when a time part isn’t indicated. If you want such a
filter to return all rows from the specified date, you need to ensure
that you store all values with midnight as the time.

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

1
2
3
4
5
6
7
8
9
--112 is ISO format 'YYYYMMDD'
DECLARE @filterDate CHAR(8) = CONVERT(CHAR(8), GETDATE(), 112)

SELECT
    *
FROM
    Sales.Orders
WHERE
    OrderDate = @filterDate


你可以试试这个

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

我通过以下代码对MS SQL 2014进行测试

1
2
SELECT CASE WHEN CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') THEN 'ok'
            ELSE '' END


用于将mm/dd/yyyy和mm/dd/yyyy等两个日期进行比较。请记住,字段的列类型必须是datetime。示例:columnname:payment_date datatype:datetime。

之后你可以很容易地比较它。查询是:

1
SELECT  *  FROM demo_date WHERE DATE >= '3/1/2015' AND DATE <=  '3/31/2015'.

很简单……它测试了它……