我有两个表格,[date]
列的类型为DATETIME2(0)
。
我必须仅按照日期部分(日+月+年)比较两个记录,丢弃时间部分(小时+分钟+秒)。
我该怎么做?
答案 0 :(得分:230)
将CAST
用于SQL Server 2008中的新DATE
数据类型,仅比较日期部分:
IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)
答案 1 :(得分:58)
Marc的答案中的一个小缺点是两个日期字段都被强制转换,这意味着您将无法利用任何索引。
因此,如果需要编写可以从日期字段上的索引中受益的查询,则需要采用以下(相当复杂的)方法。
(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)
答案 2 :(得分:4)
虽然我赞成标记为正确的答案。对于任何绊倒这个的人,我想谈谈一些事情。
一般情况下,如果您仅针对日期值进行过滤。 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
答案 3 :(得分:1)
你可以尝试这个
CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000')
我通过以下代码
测试MS SQL 2014select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok'
else '' end
答案 4 :(得分:1)
您可以使用 DateDiff
并按天进行比较。
DateDiff(dd,@date1,@date2) > 0
意思是@date2 > @date1
例如:
select DateDiff(dd, '01/01/2021 10:20:00', '02/01/2021 10:20:00')
有结果:1
答案 5 :(得分:-3)
比较两个日期,如 MM / DD / YYYY 到 MM / DD / YYYY 。 记住Field的列类型必须是dateTime。 示例: columnName: payment_date dataType: DateTime 。
之后你可以很容易地比较它。 查询是:select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
很简单...... 它测试了它......