Actualmente estoy usando una variante dateadd/dateiff con una fecha cero (0) para esto. No se requiere lanzamiento:
select dateadd(minute, datediff(minute,0,GETDATE()) / 15 * 15, 0)
GETDATE() es cualquiera que sea su fecha y hora.
Esto funcionará para fechas al menos hasta el año 5500 antes de que el archivo dateiff falle debido a un desbordamiento. Sin embargo, si intenta usar la segunda precisión, la anterior fallará de inmediato.
El uso de otra fecha fija, como '2009-01-01', o la fecha de hoy (advertencia, SQL más feo) solucionará eso. Una fecha futura también funcionará. Siempre que tenga una parte de tiempo de 00:00:00, puede basar otra fecha y hora en él.
por ejemplo:redondear a los 30 segundos más cercanos:
select dateadd(second, round(datediff(second, '2010-01-01', GETDATE()) / 30.0, 0) * 30, '2010-01-01');