Jeg bruger i øjeblikket en dateadd / datediff variant med en nul (0) dato til dette. Ingen casting påkrævet:
select dateadd(minute, datediff(minute,0,GETDATE()) / 15 * 15, 0)
GETDATE() er hvad end dit datetime er.
Dette vil virke for datoer mindst op til år 5500, før datediff fejler på grund af et overløb. Men hvis du prøver at bruge anden nøjagtighed, vil ovenstående mislykkes med det samme.
Brug af en anden fast dato, såsom '2009-01-01' eller dagens dato (advarsel, mere grim SQL) vil løse det. En fremtidig dato vil også fungere. Så længe den har en tidsdel på 00:00:00, kan du basere en anden dato og klokkeslæt på den.
for eksempel:afrund til nærmeste 30 sekunder:
select dateadd(second, round(datediff(second, '2010-01-01', GETDATE()) / 30.0, 0) * 30, '2010-01-01');