【问题标题】:In SQL Server, what is the best way to filter items for an entire day在 SQL Server 中,筛选一整天的项目的最佳方法是什么
【发布时间】:2014-10-25 01:21:25
【问题描述】:

在 SQL Server 中,我想显示特定日期的所有项目。执行此操作的最佳方法是什么:DATEPART、BETWEEN 或 >= +

1)

SELECT *
FROM BlogPosts
WHERE DATEPART(yyyy,BlogPostDate) = 2011
    AND DATEPART(m,BlogPostDate) = 5
    AND DATEPART(d,BlogPostDate) = 7

2)

SELECT *
FROM BlogPosts
WHERE BlogPostDate BETWEEN '2011-05-07' AND '2011-05-07 23:59:59'

3)

  SELECT *
    FROM BlogPosts
    WHERE BlogPostDate >= '2011-05-07' 
        AND BlogPostDate < '2011-05-08'

【问题讨论】:

    标签: sql-server filtering


    【解决方案1】:

    在您提供的选项中。 3 号,因为它既可预测又可以工作。

    数字 1 不可搜索(不能使用索引)。

    数字 2 将错过有效日期时间,例如 2011-05-07 23:59:59.997(您必须在此处使用的确切最大日期时间将在 smalldatetimedatetimedatetime2(x) 之间变化)

    如果您使用的是 SQL Server 2008,则一个替代选项 尽管看起来是可搜索的

     SELECT *     
     FROM BlogPosts     
     WHERE CAST(BlogPostDate AS Date)  = '2011-05-07'
    

    但是,我仍然会选择带有 &gt;= .... &lt; 的 3 号,因为它在所寻求的范围和可能更好地利用列统计信息方面更有效。 More details of that here.

    【讨论】:

    • 可以 2) 重写(即 2011-05-07 23:59:59.999)还是失败的原因?
    • @John - 它可以被重写,但以一种脆弱的方式,使用 2 比 3 没有任何好处。如果你尝试SELECT CAST('2011-05-07 23:59:59.999' AS datetime),你会看到它被四舍五入到2011-05-08 00:00:00.000,所以你将需要使用'2011-05-07 23:59:59.997,然后如果您更改为datetime2,您将需要去更新您所做的所有地方!
    • 好吧,我不会使用 ... .997。 DBA 可能了解我在做什么,但大多数程序员。正如你所说,无论如何,这样做超过 3) 并没有任何好处。
    • @AaronBertrand - 谢谢!
    【解决方案2】:

    我个人更喜欢下面的 DateDiff 技术。

    DECLARE @selectedDate datetime = '2011-05-07'
    
    SELECT * 
      FROM BlogPosts
     WHERE DateDiff(DAY,BlogPostDate, @selectedDate) = 0
    

    【讨论】:

      【解决方案3】:

      选项 1) 和 2) 都可以。

      选项 3 不会像您预期的那样工作,因为 datetime 的精度高于秒。所以 where 子句:

      WHERE BlogPostDate BETWEEN '2011-05-07' AND '2011-05-07 23:59:59'
      

      会错误地过滤掉:

      '2011-05-07 23:59:59.500'
      

      Datetime values are rounded to increments of .000, .003, or .007 seconds. 所以这个 WHERE 子句可以工作:

      WHERE BlogPostDate BETWEEN '2011-05-07' AND '2011-05-07 23:59:59.997'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多