SQLite сохраняет отметку времени по умолчанию как unixepoch
При определении отношения я хочу обновить атрибут метки времени при вставке. Например, рабочий стол, который у меня есть прямо сейчас
CREATE TABLE t1(
id INTEGER PRIMARY KEY AUTOINCREMENT,
time TIMESTAMP
DEFAULT CURRENT_TIMESTAMP,
txt TEXT);
Это обновление временной метки для вставки, например, insert into t1 (txt) values ('hello')
добавляет строку 1|2012-07-19 08:07:20|hello|
. Тем не менее, я хочу, чтобы эта дата была отформатирована в формате unixepoch.
Я прочитал docs, но это было неясно. Например, я изменил отношение таблицы к time TIMESTAMP DEFAULT DATETIME('now','unixepoch')
, но я получил ошибку. Здесь, как и в документах, now
была моей временной строкой, а unixepoch
был модификатором, но это не сработало. Может ли кто-нибудь помочь мне отформатировать его как временную метку unixepoch?
Ответы
Ответ 1
Используйте strftime
:
sqlite> select strftime('%s', 'now');
1342685993
Используйте его в CREATE TABLE
следующим образом:
sqlite> create table t1 (
...> id integer primary key,
...> time timestamp default (strftime('%s', 'now')),
...> txt text);
sqlite> insert into t1 (txt) values ('foo');
sqlite> insert into t1 (txt) values ('bar');
sqlite> insert into t1 (txt) values ('baz');
sqlite> select * from t1;
1|1342686319|foo
2|1342686321|bar
3|1342686323|baz
См. https://www.sqlite.org/lang_createtable.html#tablecoldef
Если значение по умолчанию для столбца является выражением в круглых скобках, тогда выражение оценивается один раз для каждой вставленной строки и результаты, используемые в новой строке.
Ответ 2
Примечание "timestamp" не является типом данных, известным для SQLite (см. список здесь). Значение по умолчанию, созданное strftime(), будет фактически сохранено как Text.
Если важно сохранить значение как число, а не как строку, объявите поле как целое и добавьте CAST() в микс, например:
create table t1(
...
ts_field integer(4) default (cast(strftime('%s','now') as int)),
...
);
Ответ 3
Действительно, strftime, который также можно использовать так:
SELECT strftime('%s', timestamp) as timestamp FROM ... ;
Дает вам:
1454521888
Столбец таблицы 'timestamp' может быть текстовым полем даже с использованием current_timestamp
как DEFAULT.
Без strftime:
SELECT timestamp FROM ... ;
Дает вам:
2016-02-03 17:51:28