Подтвердить что ты не робот

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?

4b9b3361

Ответ 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