значение времени по умолчанию базы данных sqlite "сейчас"

возможно ли в базе данных sqlite создать таблицу с столбцом метки времени по умолчанию DATETIME('now') ?

такой:

CREATE TABLE test (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    t TIMESTAMP DEFAULT DATETIME('now')
);

это дает ошибку... Как решить?

6 ответов


Я верю, что вы можете использовать

CREATE TABLE test (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  t TIMESTAMP
  DEFAULT CURRENT_TIMESTAMP
);

начиная с версии 3.1 (источник)


по словам доктора. Хипп в недавнем списке сообщение:

CREATE TABLE whatever(
     ....
     timestamp DATE DEFAULT (datetime('now','localtime')),
     ...
);

Это просто синтаксическая ошибка, вам нужно скобки: (DATETIME('now'))

Если вы посмотрите на документация, вы обратите внимание на скобочки, который добавляется около опцию 'выражение' в синтаксисе.


это полный пример, основанный на других ответах и комментариях к вопросу. В Примере метка времени (created_at - столбец) сохраняется как эпоха unix часовой пояс UTC и преобразуется в локальный часовой пояс только при необходимости.

использование Unix epoch экономит место для хранения-целое число 4 байта против строки 24 байта при сохранении в виде строки ISO8601, см. ссылке. Если 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

Localtime является правильным, поскольку я нахожусь в UTC+2 DST в момент запроса.


возможно, лучше использовать реальный тип, чтобы сэкономить место для хранения.

цитата из раздела 1.2 Типы Данных В SQLite Версии 3

SQLite не имеет класса хранения, выделенного для хранения дат и/или времени. Вместо этого встроенные функции даты и времени SQLite способны хранить даты и времена как текст, реальный, или INTEGER значения

CREATE TABLE test (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    t REAL DEFAULT (datetime('now', 'localtime'))
);

посмотреть .

и вставить строка без предоставления какого-либо значения.

INSERT INTO "test" DEFAULT VALUES;

Это синтаксическая ошибка, потому что вы не пишите скобки

Если вы пишите

выберите datetime ('сейчас') тогда это даст вам время utc, но если вы это напишите запрос, то вы должны добавить скобки перед этим Итак (datetime ('now')) для времени UTC. для местного же времени Выберите datetime ('now', 'localtime') для запроса

(datetime ('now', 'localtime'))