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

时间:2010-06-18 15:58:02

标签: sql sql-server

我在SQL server中有一个表,它有一个名为Date_Printed的DATETIME字段。我试图获取表中位于指定日期范围之间的所有记录。目前我正在使用以下SQL

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME

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

SELECT * FROM table WHERE Date_Printed BETWEEN @StartDate AND @EndDate

我在Date_Printed列上有一个索引。我想知道这是否是最好的方法来获取表中的行,这些行位于这些日期之间或者有更快的方式。该表目前有大约750,000条记录,并将继续增长。查询速度非常快,但如果可能,我想让它更快。

5 个答案:

答案 0 :(得分:3)

我建议您使用:

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

不知道当天的最后一秒会有什么打击!

答案 1 :(得分:1)

优化查询的想法:

  1. 使Date_Printed上的索引成为聚簇索引。但是,这可能会减慢其他查询和DML的速度。
  2. 如果您不需要表的所有列,请明确列出所需的列。 (即使你这样做,最好列出列。)这将减少返回查询调用者的流量。
  3. 如果您没有在Date_Printed上创建索引作为聚簇索引,并且您能够限制所需的列,那么为此查询创建覆盖索引。覆盖索引是查询所需的所有列都包含在索引中的索引。 SQL Server 2008的另一种选择是使用include选项在索引中包含列而不索引这些列。换句话说,只对date_printed进行索引,但包括要返回的其他列。
  4. 上述一些想法可能需要权衡其他DML的速度和增加的存储空间。

答案 2 :(得分:0)

除了拥有合适的索引外,你无能为力。好吧,在选择中删除“*” - 输入字段,不要求所有字段(限制数据传输)。

基本上就是这样。如果你在Date_Printed上有一个索引,正如你所说,那就是那个查询。更高的性能=更好的机器,大多数更快的光盘,更多的RAM用于缓存。

答案 3 :(得分:0)

如果您使用的是Microsoft SQL Server,那么测试查询运行SQL Server Profiler(来自工具)的效率的好方法。然后,当您运行查询时,您应该看到正在调用您的查询,并提供有关其效率的信息。 您还可以将分析器中的日志作为xml文件导出到数据库引擎优化顾问中,这可能会帮助您了解在表上创建索引的想法。

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

另一种方法是通过单击SQL Server Management Studio中的“包括实际执行计划”按钮将执行计划包含在结果中 这可能有点复杂,但应告诉您是否正在使用索引。

答案 4 :(得分:0)

在MS SQL Server上,您可以尝试使用DATEDIFF

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

不确定与BETWEEN相比有多高效。把它扔到那里。