1

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

所以这是我的数据列的样子:

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

4 回答 4

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没有时间组件的新数据类型,可以使这些类型的查询更具可读性。

于 2012-06-26T16:12:52.903 回答
1

现在有更多信息,所以我将添加一个更合适的答案。现在的要求是一个存储过程传递了一个日期类型参数,而不是日期时间,并且希望根据名为 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 数据类型;这种方法更具前瞻性,因为它不假设数据类型的精度。

于 2012-06-26T16:30:52.507 回答
0

您正在使用日期时间字段(我猜)。不要忘记时间:

select * from tablName
where startDateTime between '2012-01-17' and '2012-01-17 23:59:59.997'
于 2012-06-26T16:13:43.957 回答
0

您可以在 where 子句中使用 DateDiff 函数。它看起来像这样:

select col1, col2 from tablName where DateDiff(day, startDateTime, @DesiredDate) = 0
于 2012-06-26T16:42:28.090 回答