这可能是一个非常愚蠢的问题,但我们可以说:
declare @startdate datetime
declare @enddate datetime
set @startdate = '2013-05-01'
set @enddate = '2014-04-30'
select * from table
where table.timestamp between @startdate AND @enddate
就像我说的那样,愚蠢的问题,但这会产生2013年5月1日00:00:00到2013年4月30日00:00:00之间的所有记录吗?即一年?或者,我是否需要将结束日期改为23:59:59,将30日作为最后一天包括在内?
谢谢,并再次为可能看似愚蠢的问题道歉。答案 0 :(得分:2)
假设您有table.timestamp
的索引,最快的解决方案可能是将结束日期提前一天,并使用>=
和<
代替BETWEEN
:< / p>
select * from table
where table.timestamp >= @startdate AND table.timestamp < DATEADD(day,1,@enddate)
table.timestamp
上使用的任何公式(如truncate
,cast
等)都会否定索引的使用,除非索引基于相同的表达式。
答案 1 :(得分:1)
请尝试以下方法: -
select * from table
where cast(table.timestamp as date) between @startdate AND @enddate
无论table.timestamp
中的数据是什么,数据都会显示出来。
答案 2 :(得分:0)
这很容易测试:
CREATE TABLE #temp (id INT IDENTITY(1,1), somedates DATETIME)
INSERT INTO #temp
( somedates )
VALUES ( '2014-06-13 14:20:34' )
SELECT *
FROM #temp
WHERE somedates BETWEEN '2014-06-01' AND '2014-06-13'
--No Results returned
SELECT *
FROM #temp
WHERE somedates BETWEEN '2014-06-01' AND DATEADD(ms,-1,'2014-06-14')
--One result returned
DROP TABLE #temp
因此,如果您想在4月30日包含记录,则需要将结束日期增加1。