Jag använder för närvarande en dateadd / datediff-variant med ett noll (0) datum för detta. Ingen casting krävs:
select dateadd(minute, datediff(minute,0,GETDATE()) / 15 * 15, 0)
GETDATE() är oavsett din datumtid.
Detta kommer att fungera för datum åtminstone upp till år 5500 innan datediff misslyckas på grund av ett spill. Men om du försöker använda andra noggrannhet, kommer ovanstående att misslyckas direkt.
Att använda ett annat fast datum, som "2009-01-01", eller dagens datum (varning, fulare SQL) kommer att fixa det. Ett framtida datum kommer också att fungera. Så länge den har en tidsdel på 00:00:00 kan du basera en annan datumtid på den.
till exempel:avrunda till närmaste 30 sekunder:
select dateadd(second, round(datediff(second, '2010-01-01', GETDATE()) / 30.0, 0) * 30, '2010-01-01');