SQL Date Range仅显示过去一小时的数据

时间:2013-11-04 16:18:02

标签: sql-server range

我想做一个mssql日期范围来返回一小时时间范围内的数据。意思是,我想返回最后一小时的数据,但不是当前时间的最后一小时。

Declare @today datetime
set @today=GETDATE()
select *  from table1  where
datetime>= DATEADD(hh,-2,@Today)

例如,当前时间是上午11点50分。我希望查询在上午10:00:00到10:59:00之间返回所有数据。我的变量不能是静态的。我希望它是动态的,所以不管我一天中的哪个时间运行查询它只返回最后一小时数据,无论现在是什么时候。所以它可能是在上午11:00到凌晨11:59之间的任何时间,我仍然希望结果从早上10点到晚上10:59返回数据。

谢谢

5 个答案:

答案 0 :(得分:8)

这是一种稍微简单的方法:

DECLARE @d SMALLDATETIME;

SELECT @d = DATEADD(HOUR, DATEDIFF(HOUR, '20000101', GETDATE()) - 1, '20000101');

SELECT @d;

现在,您可以在查询中使用@d,例如

WHERE col >= @d AND col < DATEADD(HOUR, 1, @d);

这是一个开放日期范围。请不要考虑范围的“结束”或将此视为BETWEEN查询。 BETWEEN 10:00 AND 10:59不是一个非常明智的方法,因为您可能会错过10:59:00.003 -> 10:59:59.997的数据。 Background info on why BETWEEN is evil

答案 1 :(得分:1)

试试这个:

declare @lowerRange datetime = 
dateadd(hh,datepart(hour,dateadd(hh,-1,getdate())) , 
        cast(cast(getdate() as date) as smalldatetime) )

declare @upperRange datetime = dateadd(hour,1,@lowerRange)


select * from yourtable where yourdate between @lowerRange and @upperRange

答案 2 :(得分:1)

这将返回前一小时到现在的小时范围;意思是如果它是11:35AM,它将返回10 AM to 11 AM

DECLARE @today DATETIME, @hour DATETIME, @hourtwo DATETIME
SET @today = GETDATE()
-- Test other times
--SET @today = '2013-11-04 11:37.22'
SELECT @hour = DATEADD(hh,-2,@today)
SELECT @hourtwo = DATEADD(hh,-1,@today)

SELECT CONVERT(SMALLDATETIME,ROUND(CAST(@hour as float) * (24/1),0)/(24/1)) AS PreviousHourBegin

SELECT CONVERT(SMALLDATETIME,ROUND(CAST(@hourtwo as float) * (24/1),0)/(24/1)) AS PreviousHourEnd

答案 3 :(得分:1)

这应该有效:

DECLARE @D DATETIME
SET @D = GETDATE()
SELECT @D AS 'Date',
DATEADD(HOUR,-1,DATEADD(MINUTE,-(DATEPART(MINUTE, @D)),DATEADD(SECOND,-(DATEPART(SECOND, @D)),DATEADD(MILLISECOND,-(DATEPART(MILLISECOND, @D)),@D)))) AS 'Range start',
DATEADD(MINUTE,-(DATEPART(MINUTE, @D)),DATEADD(SECOND,-(DATEPART(SECOND, @D)),DATEADD(MILLISECOND,-(DATEPART(MILLISECOND, @D)),@D))) AS 'Range end'

日期:

2013-11-04 17:35:51.843 

这将返回如下范围:

Start: 2013-11-04 16:00:00.000  
End: 2013-11-04 17:00:00.000

在00:00:00-01:00:00之间的时间,它将从前一天的23:00:00-00:00:00获得。

答案 4 :(得分:1)

declare @today datetime
set @today=GETDATE()
select @today, DATEADD(HOUR, -2, DATEADD(HOUR, DATEDIFF(HOUR, 0, @today), 0)), DATEADD(MINUTE, -1, DATEADD(HOUR, -1, DATEADD(HOUR, DATEDIFF(HOUR, 0, @today), 0)))

结果:

2013-11-04 17:42:17.933 2013-11-04 15:00:00.000 2013-11-04 15:59:00.000