2008-10-14 2 views
142

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

Как это:

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

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

ответ

222

я полагаю, вы можете использовать

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

в версии 3.1 (source)

+13

Если вы обеспокоены размером хранилища, обратите внимание, что этот рецепт сохранит ваши временные метки в ISO-8601 (текстовый формат), занимая около 24 байт в базе данных за дату.Вы можете сэкономить место, просто используя столбец INTEGER (4) и сохраняя время unix с помощью значений INSERT INTO test (t) (strftime («% s», CURRENT_TIME)); – mckoss 2012-02-05 08:17:08

+2

@mckoss благодаря вашему комментарию, оператор create стал: ... mycolumn default (strftime ('% s', 'now')) – larham1 2012-06-15 06:41:42

+1

"... default (strftime ('% s', 'now')) «не является постоянным выражением, не будет работать со значением по умолчанию» Ошибка: значение по умолчанию для столбца [...] не является постоянным ». – 2012-08-04 22:35:10

71

согласно др. Hipp в недавнем список посте:

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

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

Если вы посмотрите на documentation, вы обратите внимание на круглые скобки, который добавляется вокруг «выражения» в синтаксисе.

3

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

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

Select datetime('now') then it will give you utc time but if you this write it query then you must add parenthesis before this so (datetime('now')) for UTC Time. for local time same Select datetime('now','localtime') for query

(DateTime ('теперь', 'LocalTime'))

3

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

Цитата 1,2 секция Datatypes In SQLite Version 3

SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values

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

см column-constraint.

И insert строка без какой-либо стоимости.

INSERT INTO "test" DEFAULT VALUES; 
9

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