2010-03-08 72 views
0

我有一个存储过程,将(yyyy:mm:dd hh:mM:ss)中的日期四舍五入到最近的10分钟句柄(yyyy:mm:dd hh:mM )T-SQL - 日期舍入和规范化

20100303 09:46:3000 ------> 20100303 9时50分

,但我想恰克它舍它至最接近15分钟手柄:

20100303 09: 46:3000 ------> 20100303 09:45

这是我的代码:

IF OBJECT_ID(N'[dbo].[SPNormalizeAddWhen]') IS NOT NULL 
     DROP PROCEDURE [dbo].[SPNormalizeAddWhen] 

GO 

CREATE PROCEDURE [dbo].[SPNormalizeAddWhen] 
As 
declare @colname nvarchar(20) 
set @colname='Normalized Add_When' 

if not exists (select * from syscolumns where id=object_id('Risk') and [email protected]) 
    exec('alter table Risk add [' + @colname + '] datetime') 


declare @sql nvarchar(500) 
set @sql='update Risk set [' + @colname + ']=cast(DATEPART(yyyy,[add when]) as nvarchar(4)) + ''-'' + cast(DATEPART(mm,[add when]) as nvarchar(2)) + ''-'' + cast(DATEPART(dd,[add when]) as nvarchar(2)) + '' '' + cast(DATEPART(Hh,[add when]) as nvarchar(2)) + '':'' + cast(round(DATEPART(Mi,[add when]),-1) as nvarchar(2)) ' 
print @sql 
exec(@sql) 
GO 
+0

所以基本上你要我们做工作的吗?首先,你应该研究'你的'存储过程是如何工作的。那么你应该相应地改变它, – 2010-03-08 00:48:05

+0

不知道你是如何“为我做”任何工作,我自己写了这个代码,它工作得很好:它把分钟凑到最近的10分钟的罚款,我试着ot它到最近的15分钟,找不到任何有用的东西,所以一直在寻找指针... – 2010-03-08 01:31:31

+0

其他感兴趣的人实际上给这里有用的建议是我正在寻找: 选择一轮(46,-1)= 50 选择一轮(46,?)= 45 它的这一行我需要改变,但用什么: cast(round(DATEPART(Mi,[add when]), - 1)---> ? – 2010-03-08 01:34:29

回答

3

为了圆一个时间到最近15分钟...

Select GetDate(), 
     DateAdd(Minute, 15 * Round(DateDiff(minute, 0, GetDate())/15.0, 0), 0)