是否可以在sqlite数据库中创建一个具有默认值的时间戳列的表DATETIME('now')
?
像这样:
CREATE TABLE test ( id INTEGER PRIMARY KEY AUTOINCREMENT, t TIMESTAMP DEFAULT DATETIME('now') );
这给出了错误......如何解决?
我相信你可以使用
CREATE TABLE test ( id INTEGER PRIMARY KEY AUTOINCREMENT, t TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
从版本3.1(源)
据博士说.hipp在最近的一个帖子中:
CREATE TABLE whatever( .... timestamp DATE DEFAULT (datetime('now','localtime')), ... );
这只是一个语法错误,你需要括号: (DATETIME('now'))
如果查看文档,您将注意到语法中"expr"选项周围添加的括号.
这是基于对问题的其他答案和评论的完整示例.在示例中,时间戳(created_at
-column)保存为unix epoch UTC时区,仅在必要时转换为本地时区.
使用unix epoch可节省存储空间 - 存储为ISO8601字符串时,4字节整数与24字节字符串,请参阅数据类型.如果4个字节不够,可以增加到6或8个字节.
保存UTC时区的时间戳可以方便地在多个时区显示合理的值.
SQLite版本是随Ubuntu LTS 14.04一起提供的3.8.6.
$ 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.
使用REAL类型可能更好,以节省存储空间.
在SQLite版本3中引用数据类型的 1.2部分
SQLite没有为存储日期和/或时间而预留的存储类.相反,SQLite的内置日期和时间函数能够将日期和时间存储为TEXT,REAL或INTEGER值
CREATE TABLE test ( id INTEGER PRIMARY KEY AUTOINCREMENT, t REAL DEFAULT (datetime('now', 'localtime')) );
请参阅列约束.
并插入一行而不提供任何值.
INSERT INTO "test" DEFAULT VALUES;