我有两个表,其中列[date]的类型为DATETIME2(0)。
我只能通过丢弃时间部分(hours+minutes+seconds)和日期部分(day+month+year)来比较两个记录。
我该怎么做呢?
发布于 2009-12-04 06:24:33
使用SQL Server2008中新的DATE数据类型的CAST来比较日期部分:
IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)发布于 2009-12-05 01:27:13
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)小数部分
发布于 2017-03-04 05:22:04
尽管我把被标记为正确的答案往上推了。我想对那些偶然发现这一点的人说几件事。
通常情况下,如果您专门针对Date值进行过滤。微软建议使用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 = @filterDatehttps://stackoverflow.com/questions/1843395
复制相似问题