如何创建一个表的时间戳列,默认为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')
);
这将给出一个错误。
当前回答
这是一个完整的例子,基于对这个问题的其他回答和评论。在本例中,时间戳(created_at-column)保存为unix epoch UTC时区,仅在必要时才转换为本地时区。
使用unix epoch可以节省存储空间——存储为ISO8601字符串时是4字节整型,而不是24字节字符串,请参阅数据类型。如果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。
其他回答
这是一个完整的例子,基于对这个问题的其他回答和评论。在本例中,时间戳(created_at-column)保存为unix epoch UTC时区,仅在必要时才转换为本地时区。
使用unix epoch可以节省存储空间——存储为ISO8601字符串时是4字节整型,而不是24字节字符串,请参阅数据类型。如果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。
如果你想要毫秒精度,试试这个:
CREATE TABLE my_table (
timestamp DATETIME DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);
不过,这会将时间戳保存为文本。
可能最好使用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;
这是语法错误,因为您没有写圆括号
如果你写
选择日期时间(现在的) 然后它会给你utc时间,但如果你写它查询,那么你必须在这之前加上圆括号 so (datetime('now'))为UTC时间。 本地时间相同 选择日期时间(“现在”、“作用”) 对于查询
(日期时间(“现在”,“本地时间”))
这只是一个语法错误,你需要括号:(DATETIME('now'))
DEFAULT子句的文档说:
如果列的默认值是括号中的表达式,则为插入的每一行计算一次表达式,并在新行中使用结果。
如果你看一下语法图,你还会注意到'expr'周围的括号。