I've created a rule adding a condition "Field has changed" applied to a duration field and it always evaluates to true. This happens (at least) when no duration value has been specified. The "unchanged" node has value:

array(1) (
  [0] => array(2) (
    [iso8601] => null
    [approx_seconds] => null
  )
)

And the to save node has value:

array(1) (
  [0] => array(3) (
    [iso8601] => (string)
    [approx_seconds] => (string) 0
    [duration] => null
  )
)

I guess is similar to Inconsistent handling of null (empty) filefields