You can simply use DateDiff
Returns the count (signed integer) of the specified datepart boundaries crossed between the specified startdate and enddate.
select DATEDIFF(MILLISECOND, cast('20010101 23:45:21.12347' as datetime2),
cast('20010105 12:35:15.56786' as datetime2))
Unfortunately, attempting to get the precision you require with this:
select DATEDIFF(MICROSECOND, cast('20010101 23:45:21.12347' as datetime2),
cast('20010105 12:35:15.56786' as datetime2))
results in an overflow error:
The datediff function resulted in an overflow.
The number of dateparts separating two date/time instances is too large.
Try to use datediff with a less precise datepart.
One way to achieve the precision you want would be to iteratively break into the granular time components (days, hours, minutes, seconds, etc.) and subtract this from the values using DateAdd(), e.g.
remainingAtLowerGranularity = DateAdd(granularity, -1 * numFoundInStep, value)