如何基于特定日期查询SQL Server表
我在SQL Server 2005中有一个表,它有三列:如何基于特定日期查询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。看起
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
来吧,伙计们,这方面的文档并不难找到DBETWEEN不做>=,=,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]