现在有更多信息,所以我将添加一个更合适的答案。现在的要求是一个存储过程传递了一个日期类型参数,而不是日期时间,并且希望根据名为 StartDateTime 的日期时间字段的标准从表中返回行...
create procedure dbo.spGetEntriesForOneDay
@DesiredDate DateTime
as
SET NOCOUNT ON;
SET @DesiredDate = DATEADD(day, DATEDIFF(day, 0, @DesiredDate), 0)
SELECT Field1, Field2 -- see note 1
FROM dbo.TableName
WHERE StartDateTime >= @DesiredDate -- see note 2
AND StartDateTime < DATEADD(day, 1, @DesiredDate) -- see note 3
注意 1:不要在生产代码中使用 *,尤其是在存储过程中。除了通过返回您可能不需要的列和排除在所需列的子集上优化覆盖索引之外,您还需要在基础表发生更改时重新编译此存储过程以避免不可预测的结果。
注意 2:避免在函数中包装字段。未包装在函数中的字段可能会被优化器匹配到索引,而包装在函数中的字段永远不会。
注 3:@Martin Smith 和 @RedFilter 是正确的,因为 .997 精度永远假定 DateTime 数据类型;这种方法更具前瞻性,因为它不假设数据类型的精度。