SELECT WHERE Date = Day

时间:2012-05-10 20:15:29

标签: sql sql-server sql-server-2008

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

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

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

7 个答案:

答案 0 :(得分:17)

如果您有索引,那么您将需要一些不会阻止索引使用的内容:

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

您可以在[timeStamp]列上执行截断操作以删除任何时间部分(取决于实现),但这可能会损害执行计划。不幸的是,你真的必须看看执行计划才能看到这一点,因为有时优化器对某些功能很聪明,有时却不是。

答案 1 :(得分:6)

如果您使用的是SQL 2008,则应该过去CAST。

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

Best approach to remove time part of datetime in SQL Server

---更新---

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

答案 2 :(得分: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'

答案 3 :(得分:1)

MS SQL 2014,这非常有效:

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

可能会在非常大的数据库上出现性能问题。

答案 4 :(得分:0)

试试这个.. SQL SERVER

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

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

答案 5 :(得分: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

答案 6 :(得分:-6)

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

请记住,它是一个日期时间而不是字符串。这就是你得到意想不到的结果的原因。

对于您考虑的特定查询,相应的查询是

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

您也可以通过month()和year()进行比较,返回整数值。

您通常必须编写自定义函数来进行非平凡的比较。

另请注意

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

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

前者不会影响内部效率,而后者则会影响内部效率。