Значение по умолчанию для базы данных sqlite «сейчас» - PullRequest
170 голосов
/ 14 октября 2008

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

Как это:

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

Это выдает ошибку ... Как решить?

Ответы [ 6 ]

261 голосов
/ 14 октября 2008

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

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

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

86 голосов
/ 23 октября 2008

в соответствии с др. hipp в последнем списке:

CREATE TABLE whatever(
     ....
     timestamp DATE DEFAULT (datetime('now','localtime')),
     ...
);
34 голосов
/ 16 апреля 2009

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

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

14 голосов
/ 30 сентября 2014

Это полный пример, основанный на других ответах и ​​комментариях к вопросу. В этом примере отметка времени (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

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

7 голосов
/ 21 ноября 2013

Для экономии места может быть лучше использовать тип REAL.

Цитата из 1.2 раздела Типы данных в SQLite версии 3

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

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

см. ограничение столбца .

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

INSERT INTO "test" DEFAULT VALUES;
4 голосов
/ 26 апреля 2013

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

если вы напишите

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

(даты и времени ( 'теперь', 'LocalTime'))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...