日期之间的SQL语句

时间:2012-06-26 16:11:10

标签: sql stored-procedures

这让我发疯,不知道我在这里错过了什么......

所以这里的数据列如下:

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网站:

4 个答案:

答案 0 :(得分:3)

您的查询只会与2012-01-17 00:00:002012-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