如何创建一个表的时间戳列,默认为DATETIME('现在')?

是这样的:

CREATE TABLE test (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    t TIMESTAMP DEFAULT DATETIME('now')
);

这将给出一个错误。


当前回答

这是语法错误,因为您没有写圆括号

如果你写

选择日期时间(现在的) 然后它会给你utc时间,但如果你写它查询,那么你必须在这之前加上圆括号 so (datetime('now'))为UTC时间。 本地时间相同 选择日期时间(“现在”、“作用”) 对于查询

(日期时间(“现在”,“本地时间”))

其他回答

如果你想要毫秒精度,试试这个:

CREATE TABLE my_table (
    timestamp DATETIME DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);

不过,这会将时间戳保存为文本。

这是语法错误,因为您没有写圆括号

如果你写

选择日期时间(现在的) 然后它会给你utc时间,但如果你写它查询,那么你必须在这之前加上圆括号 so (datetime('now'))为UTC时间。 本地时间相同 选择日期时间(“现在”、“作用”) 对于查询

(日期时间(“现在”,“本地时间”))

这个替代示例将本地时间存储为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')),
     ...
);

从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
);