$ 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
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
9条答案
按热度按时间cbeh67ev1#
从version 3.1.0开始,可以将
CURRENT_TIMESTAMP
与DEFAULT子句一起使用:如果数据栏的预设值是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”。
pbpqsu0x2#
根据Hipp博士在最近的一个列表帖子中所述:
gg58donl3#
这只是一个语法错误,您需要括号:
(DATETIME('now'))
DEFAULT子句的文档说明:
如果数据行的预设值是 * 括号中的运算式 *,则会针对插入的每一个数据列评估一次运算式,并在新数据列中使用结果。
如果您查看语法图,您还会注意到'expr'周围的括号。
qlckcl4x4#
这是一个基于问题的其他答案和注解的完整示例。在该示例中,时间戳(
created_at
-column)保存为unix epoch UTC时区,仅在必要时才转换为本地时区。使用unix epoch可节省存储空间- 4字节整数与24字节字符串(存储为ISO 8601字符串时),请参见datatypes。如果4字节不够,则可增加到6或8字节。
在UTC时区上保存时间戳可以方便地在多个时区上显示合理的值。
SQLite版本为3.8.6,随附于Ubuntu LTS 14.04。
本地时间是正确的,因为我在查询时位于UTC+2 DST。
ufj5ltwl5#
最好使用真实的类型,以保存存储空间。
引用自Datatypes In SQLite Version 3的1.2部分
SQLite没有专门用于存储日期和/或时间的存储类。相反,SQLite的内置日期和时间函数能够将日期和时间存储为TEXT、真实的或INTEGER值
请参见列约束。
和insert一行而不提供任何值。
kpbwa7wx6#
这是语法错误,因为您没有写入括号
如果你写
选择datetime('now '),它将为您提供UTC时间,但如果您将其写入查询,则必须在此之前添加括号,因此(datetime('now'))表示UTC时间。对于本地时间,相同选择datetime('now ','localtime')进行查询
(日期时间('now ','localtime'))
fjaof16o7#
如果需要毫秒精度,请尝试以下操作:
不过,这会将时间戳保存为文本。
wwwo4jvm8#
此替代示例将本地时间存储为Integer以保存20个字节。此工作在字段default、Update-trigger和View中完成。strftime必须使用'%s'(单引号),因为“%s”(双引号)向我抛出了'Not Constant'错误。
wz1wpwve9#
(预设值(日期时间('now ')))
或
(DEFAULT(DATETIME('现在','本地时间')))