Conversione di fuso orario su MySQL

In MySQL, per convertire un orario da un fuso orario ad un altro possiamo utilizzare la funzione CONVERT_TZ.

La conversione avviene tramite il comando

CONVERT_TZ(dataora, fusoDiPartenza, fusoDiDestinazione)
Nelle installazioni di default possiamo indicare come fusi orari unicamente degli offset come '+01:00', '-02:00', etc. Se invece, come di solito è necessario, vogliamo indicare i fusi orari "per nome" (es. Europe/Rome) sarà necessario importare prima i dati sulle varie timezones all'interno del database mysql. Ci sono diversi modi per effettuare questa operazione, il più immediato su un server Linux è quello di utilizzare mysql_tzinfo_to_sql per elaborare i dati già presenti in /usr/share/zoneinfo.

mysql_tzinfo_to_sql /usr/share/zoneinfo > tzdata.sql
cat tzdata.sql | mysql -u root -p mysql

Una volta effettuato questo import possiamo quindi indicare i fusi per nome. Se ad esempio si vuole convertire un orario dal fuso di Lisbona a quello di Roma si utilizzerà il comando

SELECT CONVERT_TZ('2017-06-27 14:30:28', 'Europe/Lisbon', 'Europe/Rome')

Potete trovare maggiorni informazioni sul supporto ai timezones in MySQL qui.

Nota
Attenzione che se la data/ora da convertire non rientra in un intervallo compreso tra '1970-01-01 00:00:01' UTC e '2038-01-19 03:14:07' UTC la funzione CONVERT_TZ non effettuerà nessuna conversione.
In generale se lavorate con i TIMESTAMP tenete a mente l' Y2038 bug.