我有两个表,其中列[date]
是类型DATETIME2(0)
。比较DATETIME和DATE忽略时间部分
我必须比较两个记录只有他们的日期部分(日+月+年),丢弃时间部分(小时+分钟+秒)。
我该怎么做?
我有两个表,其中列[date]
是类型DATETIME2(0)
。比较DATETIME和DATE忽略时间部分
我必须比较两个记录只有他们的日期部分(日+月+年),丢弃时间部分(小时+分钟+秒)。
我该怎么做?
使用CAST
在SQL Server 2008中的新DATE
数据类型比较只是日期部分:
IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)
在马克的回答一个小缺点是,无论datefields已强制转换,这意味着你会无法利用任何指标。
因此,如果需要编写一个可以从日期字段上的索引获益的查询,那么以下(相当复杂)的方法是必需的。
(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
PS:另一种仅提取日期的方法(在旧版本的SQL Server中)是使用内部表示日期的技巧。
CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
对于比较两个日期像MM/DD/YYYY到MM/DD/YYYY。 记住第一个字段的栏类型必须是dateTime。 示例:columnName:payment_date dataType:DateTime。
之后,你可以很容易地比较它。 查询:
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
它很简单...... 它测试了.....
这并不完全回答这个问题。它查询一个月,而不是一天。 – 2016-07-21 21:16:43
对于您的March查询:如果日期是'3/31/2015'时间13:00,则不会被找到。你应该使用<'4/1/2015'。 – 2016-07-21 21:16:49
也考虑使用国际日期格式'2015-03-01'。在加拿大(和许多其他地方),官方格式是DD/MM/YYYY,这使得两种格式都不明确并且存在问题。 – 2016-07-21 21:20:20
虽然我upvoted答案标记为正确的。我想谈谈一些让这个问题困扰的人的事情。
一般情况下,如果您仅在日期值过滤。 Microsoft建议使用ymd
或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 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
你可以试试这个
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
我认为你的意思=而非==。 – GilM 2009-12-03 22:29:28
@GilM:当然! ;-)今天C#太多;-) – 2009-12-03 22:29:59