代码之家  ›  专栏  ›  技术社区  ›  Chuck Haines

在SQL Server中获取日期间隔的正确方法

  •  4
  • Chuck Haines  · 技术社区  · 14 年前

    DECLARE @StartDate DATETIME
    DECLARE @EndDate DATETIME

    SET @StartDate = '2010-01-01'
    SET @EndDate = '2010-06-18 12:59:59 PM'

    从打印日期在@StartDate和@EndDate之间的表格中选择*

    我在日期栏有索引。我想知道这是获取表中那些日期之间的行的最佳方法还是有更快的方法。该表目前有大约75万条记录,而且还将继续增长。查询速度很快,但如果可能的话,我想让它更快。

    5 回复  |  直到 14 年前
        1
  •  3
  •   Brett Veenstra    14 年前

    我建议您使用:

    DECLARE @StartDate DATETIME
    DECLARE @EndDate DATETIME
    
    SET @StartDate = '2010-01-01'
    SET @EndDate = '2010-06-19'
    
    SELECT [someColumn],... FROM table WHERE Date_Printed >= @StartDate AND Date_Printed < @EndDate
    

    最后一秒

        2
  •  1
  •   Shannon Severance    14 年前

    优化思路 查询:

    1. 使打印日期的索引成为聚集索引。但是,这可能会减慢其他查询和DML的速度。
    2. 如果不需要表中的所有列,请显式列出所需的列(即使您这样做了,最好还是列出来。)这将减少返回查询调用者的通信量。
    3. 如果不在打印为聚集索引的日期创建索引,并且能够限制所需的列,则为该查询创建覆盖索引。覆盖索引是将查询所需的所有列都包含在索引中的索引。SQLServer2008上的另一种方法是使用 include

        3
  •  0
  •   TomTom    14 年前

    在这里,除了有适当的索引,你什么也做不了。好吧,去掉select-enter字段中的“*”,不要要求所有字段(限制数据传输)。

        4
  •  0
  •   samwa    14 年前

    您还可以将日志作为xml文件从profiler导出到数据库引擎优化顾问中,这可能有助于您在表上创建索引。

    另一种技术是在查询中包含SET STATISTICS IO ON,然后在消息中您将得到一个表列表(在您的示例中为1)以及查询执行的读取次数等

        5
  •  0
  •   Philip Wade    12 年前

    DATEDIFF

    SELECT * FROM table 
    WHERE DATEDIFF(dd, @StartDate, Date_Printed) > 0 
    AND DATEDIFF(dd, Date_Printed, @EndDate) > 0
    

    BETWEEN