First, you'll probably want to add an OnAfterChange event handler to the StartTime as well. Why? Well what happens if someone enters a start time, and then an end time, and then later changes the start time? You calculation will not be updated.
Okay... the one question I have for you is whether you are using relative paths in your calculation (i.e. "../StartTime") or absolute paths (i.e. "/my:myFields/my:Table/my:Row/my:StartTime").
The former should work for each row, the latter should only ever get the first row.
Greg Collins [InfoPath MVP]