2014-03-05 71 views
1

我想在具有特定时间间隔(例如5,10,15等)分钟的部分中显示信息。将日期时间顶点到特定分钟​​间隔的下一个值

但我想这种“四舍五入”这一区间的下一个值对于给定的日期时间

例如

declare @dateTime datetime = '2014-03-05 18:37'; 

select getNextDateTimeForInterval(@dateTime, 60); --> 2014-03-05 19:00 
select getNextDateTimeForInterval(@dateTime, 30); --> 2014-03-05 19:00 
select getNextDateTimeForInterval(@dateTime, 20); --> 2014-03-05 18:40 
select getNextDateTimeForInterval(@dateTime, 15); --> 2014-03-05 18:45 
select getNextDateTimeForInterval(@dateTime, 10); --> 2014-03-05 18:40 
select getNextDateTimeForInterval(@dateTime, 5); --> 2014-03-05 18:40 
select getNextDateTimeForInterval(@dateTime, 1); --> 2014-03-05 18:38 

有一个聪明的办法做到这一点?我只想出了只适用于其中一些案例的解决方案。

回答

2

似乎工作:

create function dbo.getNextDateTimeForInterval (@dt datetime, @unit int) 
returns datetime 
as 
begin 
    return DATEADD(minute,(DATEDIFF(minute,0,@dt)/@unit+1)*@unit,0) 
end 
go 
declare @dateTime datetime = '2014-03-05T18:37:00'; 

select dbo.getNextDateTimeForInterval(@dateTime, 60); --> 2014-03-05 19:00 
select dbo.getNextDateTimeForInterval(@dateTime, 30); --> 2014-03-05 19:00 
select dbo.getNextDateTimeForInterval(@dateTime, 20); --> 2014-03-05 18:40 
select dbo.getNextDateTimeForInterval(@dateTime, 15); --> 2014-03-05 18:45 
select dbo.getNextDateTimeForInterval(@dateTime, 10); --> 2014-03-05 18:40 
select dbo.getNextDateTimeForInterval(@dateTime, 5); --> 2014-03-05 18:40 
select dbo.getNextDateTimeForInterval(@dateTime, 1); --> 2014-03-05 18:38 

没有什么特别调皮需要。虽然如果您使用的时间间隔不均匀分布60,我不能保证它会符合您的期望,因为我不知道您对这种情况的期望可能会如何。


说明:DATEDIFF(minute,0,@dt)计算已经在1900-01-01开始和@dt(你通过解释0的日期得到的值)午夜经过的分钟的整数。然后我们做一个整数除法(向0舍入),该值为​​,加1然后再乘以​​- 这就是我们如何得到我们的舍入效果。然后我们使用DATEADD将新的分钟数加回1900-01-01

+0

谢谢大家对自己的答案,但你是最详细的一个,所以我会给你的功劳。 – Staeff

1

另一种方法,对于你的测试用例返回正确的值:

CREATE FUNCTION getNextDateTimeForInterval(@param datetime, @roundValue int) 
RETURNS datetime 
AS 
BEGIN 
    DECLARE @totalMinutes int; 
    SET @totalMinutes = DATEDIFF(
      minute 
      , CONVERT(date, @param) 
      , @param); 

    RETURN DATEADD(minute 
     , @totalMinutes + (@roundValue - (@totalMinutes % @roundValue)) 
     , CONVERT(DateTime, CONVERT(date, @param)) 
    ); 
END 

但要注意的是,如果你想18:37, 1 -->18:38,那么它会也是19:00, 60 -->20:00。这可能很奇怪。

1

尝试

CREATE FUNCTION getNextDateTimeForInterval(@dateTime datetime, @val int) 
RETURNS datetime 
AS 
BEGIN 

DECLARE @date DATETIME 
SET @date = CONVERT(varchar(16),@dateTime,121) 
RETURN DATEADD(MINUTE,((DATEPART(MINUTE,@date) % @val)*-1)[email protected], @date) 

END 


select getNextDateTimeForInterval(@dateTime, 60); --> 2014-03-05 19:00 
select getNextDateTimeForInterval(@dateTime, 30); --> 2014-03-05 19:00 
select getNextDateTimeForInterval(@dateTime, 20); --> 2014-03-05 18:40 
select getNextDateTimeForInterval(@dateTime, 15); --> 2014-03-05 18:45 
select getNextDateTimeForInterval(@dateTime, 10); --> 2014-03-05 18:40 
select getNextDateTimeForInterval(@dateTime, 5); --> 2014-03-05 18:40 
select getNextDateTimeForInterval(@dateTime, 1); --> 2014-03-05 18:38 
相关问题