Diaz went to Coral Gables High School, where he was teammates with Yonder Alonso and Eddy Rodríguez. In his senior year, he hit .323 with six doubles and one home run. In his freshman year at NC State, he hit .167 with 18 RBI and 18 runs. In his sophomore year, he hit .317 with 1 HR, 30 RBI and 42 runs in 60 games. In his junior year, he hit .255 with 1 HR, 31 RBI and 42 runs in 63 games. Diaz, who played summer collegiate ball in 2005 with the Thunder Bay Border Cats, was selected in the 12th round (360th overall) by the Toronto Blue Jays in the 2006 MLB Draft.
Diaz was assigned to Short-Season Auburn, where in 73 games as the team's shortstop, he hit .200 with 1 HR, 26 RBI and 34 runs. In 2007, he played with Single-A Lansing, where in 120 games, he hit .246 with 1 HR, 51 RBI, 65 runs and a league-leading 82 walks. His .406 was third in the league behind Chris Pettit (.429) and Deik Scram (.416). Diaz started 2008 with High-A Dunedin, but he was promoted to Double-A New Hampshire on May 18, where he went down and up 4 more times before finishing with the Fisher Cats. In 68 combined games, he hit .182 with 1 HR, 16 RBI, 20 runs and 43 walks. Diaz began 2009 with New Hampshire before being promoted to Triple-A Las Vegas on May 12. After a two-month stay there, he was demoted back to New Hampshire. In 94 games, he hit .195 with 1 HR, 18 RBI, 37 runs and 48 walks, including hitting .150 in 29 games in his first Triple-A stint. Diaz was the Fisher Cats Opening Day shortstop in 2010, where he played before being promoted to Las Veags on May 31. He was demoted back to New Hampshire on June 21, where he stayed before earning a one-week promotion to Las Vegas at the end of the season. In 127 games, he hit .239 with 2 HR (a career-high), 43 RBI, 68 runs, 23 doubles and 61 walks. Diaz went to spring training with the Blue Jays in 2011, and was one of the final cuts, staying as insurance for Aaron Hill, who was returning from a quadriceps injury. In 29 games during spring training, he hit .265 with 2 RBI and 6 runs. Diaz was the Fisher Cats Opening Day second baseman in 2011, where he played before being promoted to Las Vegas on April 23. On May 15, he was placed on the disabled list with an injury, and after rehabbing in Dunedin, he returned on July 5 with New Hampshire, where he played the rest of the season with. In 92 games, he hit .267 with 2 HR, 30 RBI, 41 runs and 46 walks. Diaz was with the Blue Jays for spring training in 2012, and he was cut on March 25. In 23 games, he hit .405 with 7 RBI and 9 runs. He was the Fisher Cats Opening Day second baseman, where he played before being promoted to Las Vegas on May 22. He finished the season there. In 134 games, he hit .221 with 4 HR, 40 RBI, 76 runs, 18 stolen bases and 75 walks. After the year, he became a minor league free agent
Diaz was signed a minor league deal with the Boston Red Sox on December 16, 2012. He hit .240 in 22 games with the Red Sox in spring training before being cut on March 25 and assigned to Triple-A Pawtucket. He was the PawSox Opening Day second baseman, and he played with them until his promotion.
He was promoted to the big team on June 29, 2013, and started that day's game against the Blue Jays at third base. Diaz was called up after a prolonged injury to Stephen Drew as Will Middlebrooks was ineligible for promotion (Middlebrooks was optioned June 25 and ten days had not passed) and likely call-up Brock Holt was injured. Diaz was familiar with the Red Sox defensive system because of his experience with John Farrell, Brian Butterfield, and Torey Lovullo during his time in the Toronto organization.
Diaz was optioned back to Pawtucket on July 6, and Holt was called up. Diaz was outrighted to Pawtucket on July 8. In his five-game stint, he went 0-4 with two runs scored. Diaz finished the year with Pawtucket, where in 101 games, he hit .253 with two home runs, 31 RBI, 45 runs scored and 47 walks. He became a free agent after the season.
Diaz returned to the Blue Jays on November 11, 2013 on a minor league contract with an invitation to spring training. He was initially assigned to the Triple-A Buffalo Bisons, but was brought up to the Blue Jays on March 31, 2014 before the Buffalo season started because José Reyes was added to the 15-day disabled list. Diaz made his Blue Jays debut the following day, and recorded his first career hit and RBI. He received a 2013 World Series champion ring on April 26, when the Red Sox came to Toronto for a three-game series. Diaz was optioned to Triple-A Buffalo on May 1, to make room for Steve Tolleson. He was called up again on May 12, and played in that night's game, going 0 for 4. Diaz was optioned back to Buffalo the next day. On June 25, he was designated for assignment by the Blue Jays, and outrighted to Buffalo on June 27. In 23 games with Toronto in 2014, Diaz batted .158 with 4 RBI. He elected free agency after the season ended. On October 15, Diaz signed a minor-league contract, with an invitation to spring training.
Diaz was selected from Buffalo on April 28, 2015 when José Reyes was placed on the disabled list. He was optioned back to Buffalo on May 5, and outrighted off the 40-man roster on May 15. Diaz was called up on September 30. He appeared in 7 games in 2015, batting .154 with 2 RBI. On November 6, Diaz elected free agency.
On January 8, 2016, Diaz signed a minor league contract with the New York Yankees.
On January 31, 2017, Diaz signed a minor league contract with the Toronto Blue Jays.
On July 5, 2017, Diaz was traded to the New York Yankees.