如何创建一个表的时间戳列,默认为DATETIME('现在')?
是这样的:
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t TIMESTAMP DEFAULT DATETIME('now')
);
这将给出一个错误。
如何创建一个表的时间戳列,默认为DATETIME('现在')?
是这样的:
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t TIMESTAMP DEFAULT DATETIME('now')
);
这将给出一个错误。
当前回答
从3.1.0版本开始,你可以在DEFAULT子句中使用CURRENT_TIMESTAMP:
如果列的默认值是CURRENT_TIME、CURRENT_DATE或CURRENT_TIMESTAMP,则新行中使用的值是当前UTC日期和/或时间的文本表示形式。对于CURRENT_TIME,取值格式为HH:MM:SS。对于CURRENT_DATE, "YYYY-MM-DD"。CURRENT_TIMESTAMP的格式是“YYYY-MM-DD HH:MM:SS”。
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
其他回答
可能最好使用REAL类型,以节省存储空间。
引用自SQLite版本3中的数据类型1.2部分
SQLite没有专门用于存储日期的存储类 和/或时间。相反,SQLite内置的日期和时间函数 能够存储日期和时间为文本,真实,或整数 值
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t REAL DEFAULT (datetime('now', 'localtime'))
);
参见column-constraint。
并插入一行而不提供任何值。
INSERT INTO "test" DEFAULT VALUES;
如果你想要毫秒精度,试试这个:
CREATE TABLE my_table (
timestamp DATETIME DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);
不过,这会将时间戳保存为文本。
从3.1.0版本开始,你可以在DEFAULT子句中使用CURRENT_TIMESTAMP:
如果列的默认值是CURRENT_TIME、CURRENT_DATE或CURRENT_TIMESTAMP,则新行中使用的值是当前UTC日期和/或时间的文本表示形式。对于CURRENT_TIME,取值格式为HH:MM:SS。对于CURRENT_DATE, "YYYY-MM-DD"。CURRENT_TIMESTAMP的格式是“YYYY-MM-DD HH:MM:SS”。
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
希普博士在最近的一篇文章中写道:
CREATE TABLE whatever(
....
timestamp DATE DEFAULT (datetime('now','localtime')),
...
);
这只是一个语法错误,你需要括号:(DATETIME('now'))
DEFAULT子句的文档说:
如果列的默认值是括号中的表达式,则为插入的每一行计算一次表达式,并在新行中使用结果。
如果你看一下语法图,你还会注意到'expr'周围的括号。