2012-03-09 33 views
1

在SQL Server表中,我有一个名为Timestamp的字段,它是'datetime'字段。在我创建的屏幕上,用户将传入一个日期(无时间),并且我需要返回该日期的所有记录。SQL - 将date参数与日期时间进行比较

只要做Timestamp = @Date似乎不工作,除非在该领域的时间是00:00:00。做这件事最有效的方法是什么?

+0

你最好比较没有时间戳的日期。否则..如何获得结果? – 2012-03-09 22:40:24

回答

6

由于您使用的是SQL Server 2008,因此可以使用DATE数据类型。

CAST(Timestamp AS DATE) = @Date 

之间的比较,这应该工作,并期待就在该日期 - 没有时间部分。

2

一般而言,您应该将特定日期的数据视为属于某个范围内的数据,而不是某个时间点的数据。因此,理想的查询应该使用范围,如:

WHERE [Timestamp] >= @Date 
AND [Timestamp] < DATEADD(DAY, 1, @Date) 

在这种情况下,幸运的是,优化很聪明,如果你使用CONVERT(DATE, [timestamp])对列将仍然使用索引。但在很多情况下,您需要小心,因为这通常会使您的子句不可靠。

PS Timestamp是一个可怕的列名称。这是SQL Server中的一种数据类型,与日期或时间无关。

0

将日期时间值截断时间部分的常用技巧是使用DATEDIFFDATEADD函数。在你的例子中,它将像这样使用来截断Timestamp字段的时间部分。

WHERE @DateEntered = DATEADD(DAY,0, DATEDIFF(DAY, 0, Timestamp)) 

Bascially它采取的日期时间值,因为“在用0表示日期”(由于没有一个更好的描述)发现天的名字,然后补充说,天数回。这有效地截断了时间部分。

相关问题