Ich muss einige TIMESTAMP Felder zu INT in unserem MySQL (InnoDB) DB konvertieren. Ich weiß, dass die Umwandlung eines TIMESTAMP in INT ungewöhnlich ist, aber wir müssen es trotzdem tun :)Mysql TIMESTAMP zu INTEGER konvertieren - Zeitzonen
Es scheint einfach genug zu tun, aber es gibt einige Zeitzone und Sommerzeit Fehler.
Ich habe ein Skript, das meinen SQL-Code pro Spalte generiert. Zum Beispiel erzeugt es:
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;
Wenn ich das vor und nach Daten unter Verwendung von select FROM_UNIXTIME(1291788036);
vergleichen zu können, sieht das Ergebnis gut.
Die Idee ist dann, alle clientseitige Software in UTC zu konvertieren und diese INT beim Speichern zu verwenden. Beim Abruf wird dieser INT in die aktuelle Zeitzone konvertiert.
Aber dann warn me die Dokumentation zu diesem Szenario (Sommerzeit in MEZ):
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)
Wie API und OS normalerweise mit Tageslichtsparungen umgehen? Ich weiß, dass mein PC seine Uhr in UTC hat und im Sommer, das OS fügt zwei Stunden hinzu, und im Winter eine. Ich nehme an, dass es die UTC-Zeit verwendet, um zu bestimmen, ob es DST ist oder nicht.
Also, wie gehe ich damit um? Ist die einzige Lösung, um der Datenbank ein Feld hinzuzufügen, um den DST-Offset anzugeben?
Sommerzeit ist eine andere Zeitzone. Z.B. CET ist Mitteleuropäische Zeit, MESZ ist Mitteleuropäische Sommerzeit. Ihr Betriebssystem weiß, wann es wechseln soll. Solange Sie UTC für Zeitstempel verwenden, muss die Darstellungsschicht in die lokale Zeit konvertiert werden. –