Worcestershire 331 for 6 (D'Oliveira 87*, Haynes 62, Libby 42, Conners 3-82) lead Derbyshire 321 (Madsen 87, Godleman 70, Waite 4-50) by 10 runs
Haynes made 62 from 109 balls and Worcestershire skipper D'Oliveira scored an unbeaten 87 off 122 balls to take his team to 331 for 6, a lead of 10.
Derbyshire took their first innings to 321 with Zak Chappell scoring 46 on debut and Matthew Waite finishing with figures of 4 for 50.
Chappell bagged two wickets to raise Derbyshire's hopes of a first innings lead before D'Oliveira and Waite put Worcestershire ahead.
After the frenetic pace of day one, this was more in keeping with the rhythm of the championship in early season.
Derbyshire added 21 to their overnight total in seven overs with Chappell falling four short of a fifty when he upper cut Josh Tongue to third man.
A warm, sunny day provided good conditions for batting but Derbyshire's persistent pace attack demanded respect which meant Worcestershire were forced to take a more measured approach.
Even so, Ed Pollock's occupation verged on self-denial until his attacking instincts got the better of him and he pulled the 56th ball he faced down the throat of deep square leg.
At lunch, Worcestershire had taken 24 overs to score 66 although both Azhar Ali and Jake Libby looked set to take advantage of another good Derby pitch.
That they failed to do so was down to lapses in concentration and the patience of the bowlers with Conners removing both after switching to the City End.
Azhar negotiated a testing spell from Suranga Lakmal only to be drawn into fencing at a ball he could have left and was caught behind.
Libby was the next to walk off shaking his head in frustration after an unbalanced clip off his legs was superbly snaffled by Billy Godleman plunging away to his right at midwicket.
That brought in Adam Hose for his first championship innings since August 2019 and not surprisingly he struggled to get going before he was given lbw to a ball that looked to be going down.
At that stage, Worcestershire were still 182 runs behind and Derbyshire had an opening if they could strike again quickly.
Haynes and D'Oliveira denied them, the former playing with assurance on the ground where he scored an excellent century last season while his captain lifted the scoring rate.
After Haynes completed his 50 from 93 balls, D'Oliveira drove Anuj Dal for six as the pair completed a century stand from 109 balls.
Haynes had hardly played a false shot but he became the latest batter to assist in his own downfall when he skied a hook to deep square to give Chappell his first wicket for Derbyshire.
The fast bowler had another in his next over when Gareth Roderick was pinned lbw on the back foot to shift the balance of the game back towards the home side.
D'Oliveira and Waite changed the momentum again to earn their side a second batting point and although Derbyshire claimed a second new ball they could not breakthrough.