SQL server datetime数据类型(默认时间)

时间:2014-06-13 14:18:06

标签: sql sql-server datetime

这可能是一个非常愚蠢的问题,但我们可以说:

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日作为最后一天包括在内?

谢谢,并再次为可能看似愚蠢的问题道歉。

3 个答案:

答案 0 :(得分:2)

假设您有table.timestamp的索引,最快的解决方案可能是将结束日期提前一天,并使用>=<代替BETWEEN:< / p>

select * from table 
where table.timestamp >= @startdate AND table.timestamp < DATEADD(day,1,@enddate)

table.timestamp上使用的任何公式(如truncatecast等)都会否定索引的使用,除非索引基于相同的表达式。

答案 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。