Solo haz el problemático DATEADD
en dos pasos, comenzando con una unidad de tiempo más gruesa (segundos, minutos, horas, etc.), y luego volviendo a la unidad de grano fino para el resto.
Sin embargo, evite ir al nivel de semanas y meses, ya que eso requeriría cálculos de calendario reales y preferiríamos que el sistema manejara eso.
El siguiente ejemplo necesita calcular una hora de inicio dada una (posiblemente) gran duración actual en milisegundos.
-- large durations can overflow the integer argument needed for DATEADD
-- so do as two steps subtracting minutes (60000ms) and then remaining milliseconds.
DATEADD(ms, -large_duration_ms%60000, DATEADD(minute, -large_duration_ms/60000, GETDATE()))