4

我有一个包含日期时间类型列的表。我想做一个查询,选择该日期发生的所有行。基本上,

SELECT * FROM Table
WHERE [timeStamp] = '02-15-2003'

但这只会返回 [timeStamp] 为 '02-15-2003 00:00:00.000' 的行,但实际上我想要那天任何时候的行。

4

7 回答 7

18

如果你有索引,你会想要一些不会阻止索引被使用的东西:

SELECT *
FROM Table 
WHERE [timeStamp] >= '20030215'
      AND [timeStamp] < '20030216'

您可以对[timeStamp]列执行截断操作以消除任何时间部分(依赖于实现),但这可能会损害执行计划。不幸的是,您确实必须查看执行计划才能看到这一点,因为有时优化器对某些功能很聪明,有时则不然。

于 2012-05-10T20:21:43.763 回答
8

如果您使用的是 SQL 2008,则应该 CAST to DATE。

select * from [Table]
where cast([timeStamp] as date) = '02-15-2003'

在 SQL Server 中删除日期时间的时间部分的最佳方法

- - 更新 - -

评论者应该在 2012 年用来描述为什么这不是最佳解决方案的词是sargability。更改 WHERE 子句中的数据类型虽然是最简单的解决方案,但对索引使用有影响,而有界搜索则不会。

于 2012-05-10T20:19:25.387 回答
1

  在 sql server 2008 + 中:

  SELECT * FROM Table
        WHERE cast( [timeStamp] as date)  = '02-15-2003'

或者

只是零时间部分:(2005+)

   SELECT * FROM Table
    WHERE DateAdd(day, DateDiff(day, 0, [timeStamp]), 0)  = '02-15-2003'
于 2012-05-10T20:16:36.607 回答
1

MS SQL 2014,这很完美:

SELECT [YourDateColumn] FROM [YourTable] WHERE(DATEPART(dd,[YourDateColumn]) = '29')

在非常大的数据库上可能会有一些性能问题。

于 2016-12-07T20:19:32.007 回答
0

试试这个.. SQL SERVER

SELECT * FROM Table WHERE convert(date,[timestamp]) = '2003-02-15'

应该返回指定日期的所有行。

于 2012-05-10T21:17:59.983 回答
0

我将创建一个接受“开始日期”和“结束日期”的存储过程

在这种情况下,开始日期和结束日期可以相同

这可确保返回从上午 12:01 到晚上 11:59 的所有行

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

Create PROCEDURE  TestBetweenDates
    -- Add the parameters for the stored procedure here
    @StartDate DateTime = 0, 
    @EndDate DateTime = 0
AS
BEGIN

    SET NOCOUNT ON;

        SET @StartDate = cast(Convert(varchar(10), DateAdd(d, -6, @StartDate ), 101) + ' 12:01 AM' as datetime)

        SET @EndDate = cast(Convert(varchar(10), DateAdd(d, -0, @EndDate), 101) + ' 11:59 PM' as datetime)

SELECT * FROM Table
WHERE ([timeStamp] BETWEEN @StartDate AND @EndDate) 


END
GO
于 2012-05-11T15:33:35.447 回答
-6

日期比较可能是一件棘手的事情。

请记住,它是日期时间而不是字符串。这就是为什么你会得到意想不到的结果。

对于您想到的特定查询,适当的查询是

SELECT * FROM Table 
WHERE 0 = datediff(day,[timestamp],'02-15-2003')

您也可以按返回整数值的月()和年()进行比较。

您通常必须编写自定义函数来获得重要的比较。

另请注意

WHERE 0 = datediff(day,[timestamp],'02-15-2003')

WHERE datediff(day,[timestamp],'02-15-2003') = 0

前者不干扰内部效率,而后者则干扰。

于 2012-05-10T20:23:16.263 回答