Dies ist ein vollständiges Beispiel, das auf den anderen Antworten und Kommentaren zur Frage basiert. Im Beispiel wird der Zeitstempel ( created_at
-column) als UTC-Zeitzone der Unix-Epoche gespeichert und nur bei Bedarf in die lokale Zeitzone konvertiert.
Die Verwendung der Unix-Epoche spart Speicherplatz - 4 Byte Ganzzahl vs. 24 Byte Zeichenfolge bei Speicherung als ISO8601-Zeichenfolge, siehe Datentypen . Wenn 4 Bytes nicht ausreichen, kann dies auf 6 oder 8 Bytes erhöht werden.
Durch das Speichern des Zeitstempels in der UTC-Zeitzone ist es bequem, in mehreren Zeitzonen einen angemessenen Wert anzuzeigen.
Die SQLite-Version 3.8.6 wird mit Ubuntu LTS 14.04 ausgeliefert.
$ sqlite3 so.db
SQLite version 3.8.6 2014-08-15 11:46:33
Enter ".help" for usage hints.
sqlite> .headers on
create table if not exists example (
id integer primary key autoincrement
,data text not null unique
,created_at integer(4) not null default (strftime('%s','now'))
);
insert into example(data) values
('foo')
,('bar')
;
select
id
,data
,created_at as epoch
,datetime(created_at, 'unixepoch') as utc
,datetime(created_at, 'unixepoch', 'localtime') as localtime
from example
order by id
;
id|data|epoch |utc |localtime
1 |foo |1412097842|2014-09-30 17:24:02|2014-09-30 20:24:02
2 |bar |1412097842|2014-09-30 17:24:02|2014-09-30 20:24:02
Die Ortszeit ist korrekt, da ich mich zum Zeitpunkt der Abfrage um UTC + 2 DST befinde.