私は現在、これにゼロ(0)の日付を持つdateadd/datediffバリアントを使用しています。キャスティングは必要ありません:
select dateadd(minute, datediff(minute,0,GETDATE()) / 15 * 15, 0)
GETDATE()は、日時が何であれです。
これは、オーバーフローが原因でdatediffが失敗する前に、少なくとも5500年までの日付で機能します。ただし、2番目の精度を使用しようとすると、上記はすぐに失敗します。
'2009-01-01'のような別の固定日付、または今日の日付(警告、より醜いSQL)を使用すると、それが修正されます。将来の日付も機能します。 00:00:00の時間部分がある限り、別の日時を基にすることができます。
例:30秒単位で四捨五入:
select dateadd(second, round(datediff(second, '2010-01-01', GETDATE()) / 30.0, 0) * 30, '2010-01-01');