You could use DATEADD
function:
DECLARE @time TIME = '12:31:00'
SELECT CAST(DATEADD(Hour,IIF(DATEPART(mi, @time)<=30,0,1),DATEADD(Hour, DATEDIFF(Hour, 0, @time), 0)) AS TIME);
Rextester Demo
How it works:
- Truncate time to nearest hour
- Add 1 hour if minutes > 30 (or change logic if you need to handle seconds as well)
EDIT:
Prior to SQL Server 2012 you could use CASE
instead of IIF
DECLARE @time TIME = '12:31:00'
SELECT CAST(DATEADD(Hour,CASE WHEN DATEPART(mi, @time)<=30 THEN 0 ELSE 1 END,DATEADD(Hour, DATEDIFF(Hour, 0, @time), 0)) AS TIME);
Rextester Demo 2