Basta fazer o problemático
DATEADD
em duas etapas, começando com uma unidade de tempo mais grosseira (segundos, minutos, horas etc.), depois voltando para a de granulação fina para o restante. Evite ir para o nível de semanas e meses, pois isso exigiria cálculos reais de calendário e preferiríamos que o sistema lidasse com isso.
O exemplo abaixo precisa calcular uma hora de início dada uma (possivelmente) grande duração de corrente em milissegundos.
-- 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()))