Hiervoor gebruik ik momenteel een dateadd / datediff variant met een nul (0) datum. Casten is niet nodig:
select dateadd(minute, datediff(minute,0,GETDATE()) / 15 * 15, 0)
GETDATE() is wat je datetime is.
Dit werkt voor datums tot ten minste het jaar 5500 voordat de datediff mislukt vanwege een overloop. Als u echter de tweede nauwkeurigheid probeert te gebruiken, zal bovenstaande meteen mislukken.
Het gebruik van een andere vaste datum, zoals '2009-01-01', of de datum van vandaag (waarschuwing, lelijkere SQL) zal dat oplossen. Een toekomstige datum zal ook werken. Zolang het een tijdsdeel van 00:00:00 heeft, kun je er een andere datetime op baseren.
bijvoorbeeld:rond af op de dichtstbijzijnde 30 seconden:
select dateadd(second, round(datediff(second, '2010-01-01', GETDATE()) / 30.0, 0) * 30, '2010-01-01');