2013-11-04 99 views
0

我想做一個mssql日期範圍來返回一小時時間範圍內的數據。這意味着,我想返回最近一小時的數據,但不是當前時間的最後一小時。SQL日期範圍只顯示過去一小時的數據

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

例如,當前時間是上午十一時50分零零秒我想查詢爲10:00:00時期間返回的所有數據,以上午10點59分零零秒我的變量不能是靜態的。我希望它是動態的,所以無論我現在在哪一天運行查詢,它都只返回最後一小時的數據。所以它可能是上午11點〇〇分00秒之間的任何時間,直到上午11時59分00秒,我仍然希望結果從上午10點返回的數據,直到上午10:59

謝謝

+0

請不要使用像'hh'這樣的速記 - [它有可能會咬你,我保證](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to )使用-速記與 - 日期 - 時間 - operations.aspx -kick - 。如果你的意思是'HOUR',拼出'HOUR'。 –

回答

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

試試這個:

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 
+0

這適用於「10:00至11:00之間」,這是不正確的 - 您將包括11:00的數據,即使這些數據不應包括在內。 –

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

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 
+0

這實際上返回錯誤的小時。如果是11:50,這將返回9點和9點59分,而不是10點和10點59分。另外,正如我在我的回答中指出的那樣,這個小時的「結束」實際上不是10:59。 –