这让我发疯,不知道我在这里错过了什么......
所以这里的数据列如下:
StartDateTime:
---------------
2012-01-17 11:13:46.530
2012-01-17 11:17:22.530
2012-02-17 11:31:22.223
这是我的查询试图获取:
select * from tablName
where convert(varchar(10), startDateTime, 101) between '2012-01-17' and '2012-01-17'
基于以上我应该得到两行?但它没有,它返回零行。什么是正确的做法?
PS: 我也查看了MSDN网站:
答案 0 :(得分:3)
您的查询只会与2012-01-17 00:00:00
和2012-01-17 00:00:00
之间的日期相匹配。因此,唯一的匹配是日期恰好是2012-01-17 00:00:00
。
相反,我会这样做:
declare @dateInput as DateTime
set @dateInput = '2012-01-17'
select *
from tablName
where startDateTime >= @dateInput
and startDateTime < dateadd(day, 1, @dateInput)
注意:SQL Server 2008+有一个新的数据类型Date
,没有时间组件可以使这些类型的查询更具可读性。
答案 1 :(得分:1)
现在有更多信息,所以我会添加一个更合适的答案。 这些要求现在是一个传递Date类型参数的存储过程,而不是DateTime,并且希望根据一个名为StartDateTime的DateTime字段的标准从表中返回行...
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数据类型永远;这种方法更具有未来性,因为它不会假设数据类型精度。
答案 2 :(得分:0)
您正在使用日期时间字段(我猜)。 不要忘记时间:
select * from tablName
where startDateTime between '2012-01-17' and '2012-01-17 23:59:59.997'
答案 3 :(得分:0)
您可以在where子句中使用DateDiff函数。它看起来像这样:
select col1, col2 from tablName where DateDiff(day, startDateTime, @DesiredDate) = 0