2010-02-02 10 views
24

MySQL può convertire un orario UTC memorizzato in un fuso orario locale: ora direttamente in una normale istruzione di selezione?MySQL può convertire un orario UTC memorizzato nel fuso orario locale?

Supponiamo di avere alcuni dati con un timestamp (UTC).

CREATE TABLE `SomeDateTable` (
    `id` int(11) NOT NULL auto_increment, 
    `value` float NOT NULL default '0', 
    `date` datetime NOT NULL default '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`) 
) 

Poi, quando ho

"select value, date from SomeDateTable"; 

Io, naturalmente, ottenere tutte le date come nella loro forma UTC memorizzato.

Ma diciamo che mi piacerebbe averli in un altro fuso orario (con DST), posso quindi aggiungere un po 'di magia alla query di selezione in modo da ottenere tutte le date indietro nel fuso orario selezionato?

"select value, TIMEZONE(date, "Europe/Berlin") from SomeDateTable"; 

Oppure devo farlo in qualche altro strato in alto, come in qualche codice php? (sembra che la maggior parte delle persone abbia risolto questo problema).

Grazie Johan


Se l'installazione di MySQL consente di utilizzare CONVERT_TZ si tratta di una soluzione molto pulita, questo esempio mostra come usarlo.

SELECT CONVERT_TZ('2010-01-01 12:00', 'UTC', 'Europe/Stockholm') 

Tuttavia non so se questo è un buon modo dal momento che alcuni installazione di MySQL non è presente questa funzione, usare con cautela.

risposta

1

io non sono sicuro di ciò che la matematica può essere fatto su un tipo di dati DATETIME, ma se si sta utilizzando PHP, vi consiglio vivamente di utilizzare i timestamp numero intero a base. Fondamentalmente, è possibile memorizzare un numero intero a 4 byte nel database usando la funzione time() di PHP. Questo rende la matematica molto più semplice.

+0

Il convert_tz era la risposta alla mia domanda, ma forse userò PHP per questo comunque ...dal momento che il server in cui ospitavo il mio sito mancava anche i dati del fuso orario (e lì non posso ripararlo ...) – Johan

3

propongo di usare

SET time_zone = 'proper timezone'; 

stato fatto una volta subito dopo la connessione al database. e dopo questo tutti i timestamp verranno convertiti automaticamente al momento della loro selezione.

+10

Importante notare che questo non convertirà automaticamente i campi DATE, TIME e DATETIME. Questo farà solo conversioni automatiche per i campi TIMESTAMP e influenzerà i risultati delle funzioni NOW() e CURDATE(). – Tom

+0

Se si desidera che questo sia permanente, è anche possibile modificare il parametro time_zone. – jamsandwich

12

Per coloro che non sono in grado di configurare l'ambiente mysql (ad esempio a causa della mancanza di accesso SUPER) per utilizzare nomi di fuso orario di tipo umano come "America/Denver" o "GMT", è anche possibile utilizzare la funzione con offset numerici come questo:

CONVERT_TZ(date,'+00:00','-07:00')

+4

Che non funzionerà se quel fuso orario ha l'ora legale (http://www.timeanddate.com/time/dst/) poiché avrai diversi offset sommer e winter, e ci sono anche alcuni esempi con 30min DST ... – Johan

+0

interessante .. nel mio caso devo eseguire alcune query da PHP e non voglio fare alcuna manipolazione TZ con i risultati in PHP, ma potrei facilmente modificare il valore numerico nella query di selezione. Grazie – tmsimont

4

select convert_tz(now(),@@session.time_zone,'+03:00')

per ottenere il tempo di utilizzare solo tempo (convert_tz (ora(), @@ session.time_zone, '+ 3:00'))

Problemi correlati