Thanks everybody for your input.
This is what I ended up doing. I saved the original datetime and the GMT offset separately.
My query looks like this:
SELECT cl.metropolitan_area, cl.date_time, edt.date_timeEDT
, DAYOFMONTH(cl.date_time) dayOrg
, MONTH(cl.date_time) AS monthOrg
, DATE_FORMAT(cl.date_time, '%h:%i %p') AS dateTimeOrg
, DAYOFMONTH(edt.date_timeEDT) dayEDT
, MONTH(edt.date_timeEDT) AS monthEDT
, DATE_FORMAT(edt.date_timeEDT, '%h:%i %p') AS dateTimeEDT
FROM(
SELECT CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00') AS date_timeEDT, id
FROM ccrraa
) edt
INNER JOIN ccrraa AS cl ON cl.id = edt.id
ORDER BY cl.gmt_offset DESC;
By the way, is this query more efficient than the following one?
I would think it is, but you never know.
(The following query calls CONVERT_TZ() 3+ times, while the other one has a subquery and an inner join)
SELECT metropolitan_area, date_time, gmt_offset, gmt_offset + 4 AS hours, CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00') AS EDT
, DAYOFMONTH(date_time) AS day, MONTH(date_time) AS month, DATE_FORMAT(date_time, '%h:%i %p') AS date_time_
, DAYOFMONTH( CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00') ) AS dayEDT
, MONTH( CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00') ) AS monthEDT
, DATE_FORMAT( CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00') , '%h:%i %p') AS date_timeEDT
FROM ccrraa
ORDER BY gmt_offset DESC;