我想做一个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返回数据。
谢谢
答案 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