Basta fare il problematico DATEADD
in due fasi, partendo da un'unità di tempo più grossolana (secondi, minuti, ore ecc.), per poi tornare a quella a grana fine per il resto.
Evita di passare al livello di settimane e mesi, poiché ciò richiederebbe calcoli di calendario effettivi e preferiremmo che il sistema gestisse questo.
L'esempio seguente deve calcolare un'ora di inizio data una (possibilmente) durata della corrente elevata in millisecondi.
-- 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()))