如何创建一个表的时间戳列,默认为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')
);
这将给出一个错误。
当前回答
如果你想要毫秒精度,试试这个:
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
);
这个替代示例将本地时间存储为Integer以节省20个字节。这项工作在字段default、Update-trigger和View中完成。 strftime必须使用“%s”(单引号),因为“%s”(双引号)向我抛出了一个“非常量”错误。
Create Table Demo (
idDemo Integer Not Null Primary Key AutoIncrement
,DemoValue Text Not Null Unique
,DatTimIns Integer(4) Not Null Default (strftime('%s', DateTime('Now', 'localtime'))) -- get Now/UTC, convert to local, convert to string/Unix Time, store as Integer(4)
,DatTimUpd Integer(4) Null
);
Create Trigger trgDemoUpd After Update On Demo Begin
Update Demo Set
DatTimUpd = strftime('%s', DateTime('Now', 'localtime')) -- same as DatTimIns
Where idDemo = new.idDemo;
End;
Create View If Not Exists vewDemo As Select -- convert Unix-Times to DateTimes so not every single query needs to do so
idDemo
,DemoValue
,DateTime(DatTimIns, 'unixepoch') As DatTimIns -- convert Integer(4) (treating it as Unix-Time)
,DateTime(DatTimUpd, 'unixepoch') As DatTimUpd -- to YYYY-MM-DD HH:MM:SS
From Demo;
Insert Into Demo (DemoValue) Values ('One'); -- activate the field Default
-- WAIT a few seconds --
Insert Into Demo (DemoValue) Values ('Two'); -- same thing but with
Insert Into Demo (DemoValue) Values ('Thr'); -- later time values
Update Demo Set DemoValue = DemoValue || ' Upd' Where idDemo = 1; -- activate the Update-trigger
Select * From Demo; -- display raw audit values
idDemo DemoValue DatTimIns DatTimUpd
------ --------- ---------- ----------
1 One Upd 1560024902 1560024944
2 Two 1560024944
3 Thr 1560024944
Select * From vewDemo; -- display automatic audit values
idDemo DemoValue DatTimIns DatTimUpd
------ --------- ------------------- -------------------
1 One Upd 2019-06-08 20:15:02 2019-06-08 20:15:44
2 Two 2019-06-08 20:15:44
3 Thr 2019-06-08 20:15:44
希普博士在最近的一篇文章中写道:
CREATE TABLE whatever(
....
timestamp DATE DEFAULT (datetime('now','localtime')),
...
);
如果你想要毫秒精度,试试这个:
CREATE TABLE my_table (
timestamp DATETIME DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);
不过,这会将时间戳保存为文本。
这只是一个语法错误,你需要括号:(DATETIME('now'))
DEFAULT子句的文档说:
如果列的默认值是括号中的表达式,则为插入的每一行计算一次表达式,并在新行中使用结果。
如果你看一下语法图,你还会注意到'expr'周围的括号。