我有两个表,其中列[date]
的类型为DATETIME2(0)
.
我必须仅按日期部分(日+月+年)比较两条记录,丢弃时间部分(小时+分钟+秒)。
我怎样才能做到这一点?
我有两个表,其中列[date]
的类型为DATETIME2(0)
.
我必须仅按日期部分(日+月+年)比较两条记录,丢弃时间部分(小时+分钟+秒)。
我怎样才能做到这一点?
使用SQL Server 2008 中CAST
的新数据类型来仅比较日期部分:DATE
IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)
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)
尽管我赞成标记为正确的答案。我想为遇到此问题的任何人谈谈一些事情。
通常,如果您仅针对Date值进行过滤。Microsoft 建议使用ymd
or的语言中性格式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
您可以DateDiff
按天使用和比较。
DateDiff(dd,@date1,@date2) > 0
它的意思是@date2 > @date1
例如 :
select DateDiff(dd, '01/01/2021 10:20:00', '02/01/2021 10:20:00')
结果:1
对于将 MM/DD/YYYY 等两个日期与MM/DD/YYYY进行比较 。请记住,字段的第一件事列类型必须是日期时间。示例:columnName: payment_date dataType:DateTime。
之后,您可以轻松比较它。查询是:
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
它很简单......它测试它......