如何基于特定日期查询SQL Server表

如何基于特定日期查询SQL Server表,sql,sql-server,database,Sql,Sql Server,Database,我在SQL Server 2005中有一个表,它有三列: id (int), message (text), timestamp (datetime) 时间戳和id上有一个索引 我想做一个查询,检索给定日期的所有消息,比如“12/20/2008”。但是,我知道,简单地在timestamp='12/20/2008'的位置执行操作不会给出正确的结果,因为该字段是一个datetime字段 有人建议使用DATEPART函数,从时间戳中提取年、月和日,并验证它们是否分别等于2008、12和20。看起

我在SQL Server 2005中有一个表,它有三列:

id (int), 
message (text), 
timestamp (datetime)
时间戳和id上有一个索引

我想做一个查询,检索给定日期的所有消息,比如“12/20/2008”。但是,我知道,简单地在timestamp='12/20/2008'的位置执行操作不会给出正确的结果,因为该字段是一个datetime字段

有人建议使用DATEPART函数,从时间戳中提取年、月和日,并验证它们是否分别等于2008、12和20。看起来这不会使用我在时间戳上的索引,最终会进行一次完整的表扫描

那么,构建查询的最佳方法是什么,以便利用我创建的索引

——避免为每行重新计算@MyDate+1
-- avoid re-calculating @MyDate +1 for every row
DECLARE @NextDay DateTime
Set @NextDay = @MyDate + 1

SELECT 
    -- ...
WHERE [timestamp] >= @MyDate AND [timestamp] < @NextDay
声明@NextDay DateTime 设置@NextDay=@MyDate+1 挑选 -- ... 其中[timestamp]>=@MyDate和[timestamp]<@NextDay
--避免为每行重新计算@MyDate+1
声明@NextDay DateTime
设置@NextDay=@MyDate+1
挑选
-- ...
其中[timestamp]>=@MyDate和[timestamp]<@NextDay

中间语句可以帮助您

SELECT *
FROM MyTable
WHERE TimeStamp BETWEEN @Start AND @End;

对于您想要发送消息的日期,开始时间应该是上午12:01左右,结束时间应该是晚上11:59左右。

中间语句可以帮助您

SELECT *
FROM MyTable
WHERE TimeStamp BETWEEN @Start AND @End;

在您想要发送消息的当天,开始时间应该是上午12:01左右,结束时间应该是晚上11:59左右。

根据我的经验,使用两个日期时间变量一直都非常有效。这项决议的问题似乎不大可能。然而,要记住的一个重要事实是(任何类型的)范围包括两个端点。因此,您不能在两个日期测试使用BETWEEN,因为它将同时包含这两个日期。而是使用类似

datefield>=@startdate和datefield<@enddate


来吧,伙计们,这方面的文档并不难找到在我的经验中,两个日期时间变量的使用始终是正确的。这项决议的问题似乎不大可能。然而,要记住的一个重要事实是(任何类型的)范围包括两个端点。因此,您不能在两个日期测试使用BETWEEN,因为它将同时包含这两个日期。而是使用类似

datefield>=@startdate和datefield<@enddate


来吧,伙计们,这方面的文档并不难找到D

BETWEEN不做>=,=,BETWEEN不做>=,=,假设@Date是您想要所有消息的日期的任何日期时间的日期时间值,请使用

Where [timestamp] >= DateAdd(day, DateDiff(day, 0, @Date), 0) 
  And [timestamp] <  DateAdd(day, DateDiff(day, 0, @Date), 1) 

它将取整为表示第二天日期的整数。上面的脚本将输出2008年12月26日

假设@Date是您想要所有消息的日期的任何日期时间的日期时间值,请使用

Where [timestamp] >= DateAdd(day, DateDiff(day, 0, @Date), 0) 
  And [timestamp] <  DateAdd(day, DateDiff(day, 0, @Date), 1) 

它将取整为表示第二天日期的整数。上面的脚本将于2008年12月26日输出

SQL server是否不够聪明,无法理解它只需要为语句计算@MyDate+1一次?可能吧。但是,我知道,对于getdate(),它不会这样做。当然,这是一个函数调用,有点不同。但是我对在where子句中留下任何我不需要的东西有点偏执。如果@MyDate有时间段,这将不起作用。要解决这个问题,请使用:Where[timestamp]>=DateAdd(day,DateDiff(day,0,@Date),0)和[timestamp]=DateAdd(day,DateDiff(day,0,@Date),0)和[timestamp]