24

定义关系时,我想在插入时将属性更新为时间戳。例如,我现在拥有的一张工作表

CREATE TABLE t1(
id INTEGER PRIMARY KEY AUTOINCREMENT,
time TIMESTAMP
DEFAULT CURRENT_TIMESTAMP,
txt TEXT);

这是在插入时更新时间戳,例如,insert into t1 (txt) values ('hello')添加行1|2012-07-19 08:07:20|hello|。但是,我希望将此日期格式化为 unixepoch 格式。

我阅读了文档,但这并不清楚。例如,我修改了表关系,time TIMESTAMP DEFAULT DATETIME('now','unixepoch')但出现错误。在这里,就像在文档中一样,now是我的时间字符串并且unixepoch是修饰符,但它不起作用。有人可以帮我如何将其格式化为 unixepoch 时间戳吗?

4

3 回答 3

52

使用strftime

sqlite> select strftime('%s', 'now');
1342685993

像这样使用它CREATE TABLE

sqlite> create table t1 (
   ...> id integer primary key,
   ...> time timestamp default (strftime('%s', 'now')),
   ...> txt text);
sqlite> insert into t1 (txt) values ('foo');
sqlite> insert into t1 (txt) values ('bar');
sqlite> insert into t1 (txt) values ('baz');
sqlite> select * from t1;
1|1342686319|foo
2|1342686321|bar
3|1342686323|baz

https://www.sqlite.org/lang_createtable.html#tablecoldef

如果列的默认值是括号中的表达式,则表达式会为插入的每一行计算一次,并将结果用于新行。

于 2012-07-19T08:20:15.620 回答
17

注意 'timestamp' 不是 SQLite 已知的数据类型(请参阅此处的列表)。strftime() 生成的默认值实际上将存储为文本。

如果将值存储为数字而不是字符串很重要,请将字段声明为 Integer 并将 CAST() 添加到组合中,如下所示:

create table t1(
...
ts_field integer(4) default (cast(strftime('%s','now') as int)),
...
);
于 2015-04-02T18:33:06.103 回答
3

事实上 strftime,也可以这样使用:

SELECT strftime('%s', timestamp) as timestamp FROM ... ;

给你:

1454521888

'timestamp' 表列甚至可以是文本字段,使用current_timestampas DEFAULT。

没有 strftime:

SELECT timestamp FROM ... ;

给你:

2016-02-03 17:51:28

于 2016-02-03T18:02:02.570 回答