SQL - 将日期参数与datetime进行比较

时间:2012-03-09 22:37:55

标签: sql sql-server-2008

在SQL Server表中,我有一个名为Timestamp的字段,它是一个'datetime'字段。在我创建的屏幕上,用户将传递一个日期(没有时间),我需要返回该日期的所有记录。

只是做Timestamp = @Date似乎不起作用,除非字段中的时间是00:00:00。这样做最有效的方法是什么?

3 个答案:

答案 0 :(得分:6)

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

之间进行比较
 CAST(Timestamp AS DATE) = @Date

这应该起作用,只看日期 - 没有时间部分。

答案 1 :(得分:2)

通常,您应该将特定日期的数据视为属于某个范围的数据,而不是单个时间点。理想情况下,您的查询应使用范围,例如:

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

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

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

答案 2 :(得分:0)

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

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

基本上,它采用日期时间值并查找自“由0表示的日期”以来的天数(由于缺少更好的描述),然后再添加该天数。这有效地截断了时间部分。