2013-08-07 12 views
5

Ho bisogno di convertire alcuni campi TIMESTAMP in INT nel nostro DB MySQL (InnoDB). Mi rendo conto che la conversione di un TIMESTAMP in INT è inusuale, ma dobbiamo ancora farlo :)Mysql conversione da TIMESTAMP a INTEGER - fusi orari

Sembra abbastanza semplice da fare, ma ci sono alcuni errori di fuso orario e di ora legale.

Ho uno script che genera il mio codice SQL per colonna. Per esempio, genera:

ALTER TABLE alarmLog ADD COLUMN started_tmp INT UNSIGNED; 
UPDATE alarmLog SET started_tmp = UNIX_TIMESTAMP(started); 
ALTER TABLE alarmLog DROP started; 
alter TABLE alarmLog CHANGE started_tmp started INT UNSIGNED NULL DEFAULT 0; 

Se confronto prima e dopo i dati utilizzando select FROM_UNIXTIME(1291788036);, il risultato sembra buono.

L'idea è quindi di cambiare tutto il software lato client per convertire in UTC e utilizzare quello INT quando lo si archivia. Quando si recupera, INT viene convertito nel fuso orario corrente.

ma poi la documentazione warn me su questo scenario (ora legale in CET):

mysql> SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00'); 
+---------------------------------------+ 
| UNIX_TIMESTAMP('2005-03-27 02:00:00') | 
+---------------------------------------+ 
|       1111885200 | 
+---------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00'); 
+---------------------------------------+ 
| UNIX_TIMESTAMP('2005-03-27 03:00:00') | 
+---------------------------------------+ 
|       1111885200 | 
+---------------------------------------+ 
1 row in set (0.00 sec) 

Come API e sistemi operativi normalmente si occupano di risparmio di luce del giorno? So che il mio PC ha il suo orologio in UTC e in estate, il sistema operativo aggiunge due ore ad esso, e in inverno uno. Presumo che usi l'ora UTC per determinare se è l'ora legale o meno.

Quindi, come faccio a gestire questo? È l'unica soluzione per aggiungere un campo al database per specificare l'offset dell'ora legale?

+1

L'ora legale è un fuso orario diverso. Per esempio. CET è Central European Time, CEST è l'ora legale dell'Europa centrale. Il tuo sistema operativo sa quando cambiare. Finché usi UTC per i timestamp, è compito del livello di presentazione convertirlo in ora locale. –

risposta

3

Non è necessario memorizzare l'ora in INT. Il tipo TIMESTAMP di MySQL lo fa comunque (usa timestamp standard unix per memorizzare l'ora) e sono sempre in UTC.

È sufficiente impostare il fuso orario della sessione e tutte le colonne TIMESTAMP verranno convertite da/alla zona quando le si aggiorna/si seleziona.

È possibile impostare la zona al momento di connessione/inizializzazione una volta:

SET time_zone = '+10:00'; 

E quindi è possibile selezionare/aggiornare il tempo nella tua zona direttamente

SELECT timesamp_column FROM table ... 

Io non sono molto familiare con libtime datetime ma suppongo che utilizzino il fuso orario che hai fornito e il tempo in questione per determinare le correzioni del fuso orario e dell'ora legale.

Nell'esempio che hai fornito, penso che uno dei valori non sia effettivamente valido, perché l'orologio suppone saltare da 01:59:59 a 03:00:00 e 02:00:00 non è mai successo. La funzione UNIX_TIMESTAMP restituisce probabilmente il secondo più vicino in quel caso.

+0

So che posso usare i timestamp, ma non posso usare quel tipo. Il lato client deve essere compatibile con sqlite, quindi da qui la conversione in INT. E sul tempo invalido; alla fine dell'ora legale ti risparmia due volte al giorno, il che avrebbe lo stesso problema. – Halfgaar

+0

Ci sono più punti nel tempo con la stessa rappresentazione di stringa e ci sono anche degli spazi vuoti. Non penso che ci sia qualcosa che puoi fare al riguardo. Memorizza i tuoi valori come unix timestamp (INT) e convertili in ora locale con le funzioni di MySQL o il lato client della libreria dei tempi. Finché hai impostato correttamente il fuso orario, dovrebbe essere visualizzato correttamente. – Vatev

+0

Ho appena testato l'inserimento di "2005-03-27 02:00:00" in una colonna TIMESTAMP. Recuperarlo ti dà anche "2005-03-27 03:00:00", quindi immagino che vada bene. – Halfgaar