J'utilise actuellement une variante dateadd / datediff avec une date zéro (0) pour cela. Aucun casting requis :
select dateadd(minute, datediff(minute,0,GETDATE()) / 15 * 15, 0)
GETDATE() est quelle que soit votre date/heure.
Cela fonctionnera pour les dates au moins jusqu'à l'an 5500 avant l'échec de datediff en raison d'un débordement. Cependant, si vous essayez d'utiliser la seconde précision, ci-dessus échouera immédiatement.
L'utilisation d'une autre date fixe, comme '2009-01-01', ou la date d'aujourd'hui (avertissement, SQL plus moche) résoudra ce problème. Une date future fonctionnera également. Tant qu'il a une partie horaire de 00:00:00, vous pouvez baser une autre date/heure dessus.
par exemple :arrondir aux 30 secondes les plus proches :
select dateadd(second, round(datediff(second, '2010-01-01', GETDATE()) / 30.0, 0) * 30, '2010-01-01');