diff --git a/lib/gitlab/ci/pipeline_duration.rb b/lib/gitlab/ci/pipeline_duration.rb
index 0c7c38e2b67bc8e30863d49deace207e376fe77c..ac68fd0272f9081521a4c738051ca82325757a51 100644
--- a/lib/gitlab/ci/pipeline_duration.rb
+++ b/lib/gitlab/ci/pipeline_duration.rb
@@ -107,19 +107,20 @@ module Gitlab
       end
 
       def self.from_pipeline(pipeline)
+        now = Time.now
         status = %w[success failed running canceled]
         builds = pipeline.builds.latest.where(status: status)
 
-        running = from_builds(builds, :started_at, :finished_at).duration
-        total = from_builds(builds, :queued_at, :finished_at).duration
+        running = from_builds(builds, :started_at, :finished_at, now).duration
         pending = pipeline.started_at - pipeline.created_at
+        queuing = builds.inject(0) do |result, job|
+          result + ((job.started_at || now) - (job.queued_at || now))
+        end
 
-        [running, pending + total - running]
+        [running, pending + queuing]
       end
 
-      def self.from_builds(builds, from, to)
-        now = Time.now
-
+      def self.from_builds(builds, from, to, now = Time.now)
         periods = builds.map do |b|
           Period.new(b.public_send(from) || now, b.public_send(to) || now)
         end
diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb
index 2c04ef298bca42a3bb80106545b901ae62596ced..194c3fc01f126a7617f5ea806b4172014caba2e0 100644
--- a/spec/models/ci/pipeline_spec.rb
+++ b/spec/models/ci/pipeline_spec.rb
@@ -156,7 +156,7 @@ describe Ci::Pipeline, models: true do
         pipeline.reload
 
         expect(pipeline.duration).to eq(40)
-        expect(pipeline.pending_duration).to eq(25)
+        expect(pipeline.pending_duration).to eq(45)
       end
     end