0

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

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

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

谢谢

4

5 回答 5

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. 关于为什么是邪恶的背景信息BETWEEN

于 2013-11-04T16:56:28.187 回答
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
于 2013-11-04T16:35:54.843 回答
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
于 2013-11-04T16:36:03.470 回答
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 范围。

于 2013-11-04T16:38:03.350 回答
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
于 2013-11-04T16:40:57.950 回答