Это полный пример, основанный на других ответах и комментариях к вопросу. В примере временная метка (created_at
-column) сохраняется как unix epoch часовой пояс UTC и преобразуется в местный часовой пояс только при необходимости.
Использование unix epoch сохраняет пространство для хранения - 4 байта целых строк по сравнению с 24 байтами при сохранении в виде строки ISO8601, см. datatypes. Если 4 байта недостаточно, их можно увеличить до 6 или 8 байтов.
Сохранение временной метки в часовом поясе UTC позволяет удобно отображать разумные значения при нескольких часовых поясах.
Версия SQLite - 3.8.6, которая поставляется с Ubuntu LTS 14.04.
$ 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
Местное время верное, так как я нахожусь в UTC + 2 DST в момент запроса.
Если вы обеспокоены размером хранилища, обратите внимание, что этот рецепт сохранит ваши временные метки в ISO-8601 (текстовый формат), занимая около 24 байт в базе данных за дату.Вы можете сэкономить место, просто используя столбец INTEGER (4) и сохраняя время unix с помощью значений INSERT INTO test (t) (strftime («% s», CURRENT_TIME)); – mckoss 2012-02-05 08:17:08
@mckoss благодаря вашему комментарию, оператор create стал: ... mycolumn default (strftime ('% s', 'now')) – larham1 2012-06-15 06:41:42
"... default (strftime ('% s', 'now')) «не является постоянным выражением, не будет работать со значением по умолчанию» Ошибка: значение по умолчанию для столбца [...] не является постоянным ». – 2012-08-04 22:35:10