在SQL Server 2008中只比较两个DATETIME,而不是date
我有两个表,其中列[date]
是typesDATETIME2(0)
。
我必须比较两个logging只有他们的date部分(日+月+年),丢弃时间部分(小时+分钟+秒)。
我怎样才能做到这一点?
将CAST
用于SQL Server 2008中新的DATE
数据types,以比较date部分:
IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)
Marc的答案中的一个小缺点是,这两个date字段都是被强制转换的,这意味着你将无法利用任何索引。
因此,如果需要编写一个可以从date字段的索引中受益的查询,那么下面的(相当复杂的)方法是必要的。
- 索引的date字段(称为DF1)必须不受任何types的函数影响。
- 因此,您必须将DF1与DF2当天的全部date时间值进行比较。
- 这是从DF2的date部分到DF2之后的date部分。
- 即
(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
- 注意 :比较是> = (等于允许)至DF2的date,并且(严格) < DF2之后的一天是非常重要的。 此外,BETWEEN运算符不起作用,因为它允许两边平等。
PS:提取date的另一种方法(在旧版本的SQL Server中)是使用内部表示date的技巧。
- 将date转换为浮点数。
- 截断小数部分
- 将该值转换回date时间
- 即
CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
虽然我赞成答案被标记为正确的。 我想碰碰到一些事情,让任何人磕磕碰碰。
一般来说,如果你只是单独过滤date值。 Microsoftbuild议使用ymd
或ymd
的语言中立格式。
请注意,表单“2007-02-12”仅针对数据typesDATE,DATETIME2和DATETIMEOFFSET,被认为是语言中立的。
用上述方法做date比较很简单。 考虑下面这个人为的例子。
--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有效地使用索引。 也就是说,如果您存储的数据只关注date而不是时间,请考虑将时间存储为DATETIME
。 因为:
当SQL Server将文字转换为过滤列的types时,它将在未指示时间部分的情况下假定为午夜。 如果您希望这样的filter从指定的date返回所有行,则需要确保您将所有值与午夜时间一起存储。
因此,假设你只关心date,并存储你的数据。 上面的查询可以简化为:
--112 is ISO format 'YYYYMMDD' declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112) select * from Sales.Orders where OrderDate = @filterDate
将两个date比如MM / DD / YYYY与MM / DD / YYYY进行比较 。 记住第一个字段的列types必须是dateTime。 示例: columnName: payment_date dataType: DateTime 。
之后,你可以很容易地比较它。 查询是:
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
这很简单……它testing了…..