是否可以在sqlite数据库中创建一个具有默认为DATETIME('now')
的时间戳列的表?
像这样:
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t TIMESTAMP DEFAULT DATETIME('now')
);
这会出错...如何解决?
答案 0 :(得分:261)
我相信你可以使用
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
);
版本3.1(source)
答案 1 :(得分:86)
CREATE TABLE whatever(
....
timestamp DATE DEFAULT (datetime('now','localtime')),
...
);
答案 2 :(得分:34)
这只是一个语法错误,你需要括号:(DATETIME('now'))
如果查看documentation,您会注意到语法中'expr'选项周围添加的括号。
答案 3 :(得分:14)
这是基于问题的其他答案和评论的完整示例。在示例中,时间戳(created_at
- 列)保存为unix epoch UTC时区,仅在必要时转换为本地时区。
使用unix epoch可节省存储空间 - 存储为ISO8601字符串时,4字节整数与24字节字符串,请参阅datatypes。如果4个字节不够,可以增加到6或8个字节。
在UTC时区保存时间戳可以方便地在多个时区显示合理的值。
SQLite版本是随Ubuntu LTS 14.04一起提供的3.8.6。
$ 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。
答案 4 :(得分:7)
使用REAL类型可能更好,以节省存储空间。
引自Datatypes In SQLite Version 3
的1.2部分SQLite没有为存储日期留出的存储类 和/或时间。相反,SQLite的内置日期和时间函数 能够将日期和时间存储为TEXT,REAL或INTEGER 值
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t REAL DEFAULT (datetime('now', 'localtime'))
);
请参阅column-constraint 。
insert一行没有提供任何价值。
INSERT INTO "test" DEFAULT VALUES;
答案 5 :(得分:4)
这是语法错误,因为您没有写括号
如果你写
选择日期时间('现在') 然后它会给你utc时间,但如果你这样写它查询,那么你必须在此之前添加括号 所以(日期时间('现在'))为UTC时间。 当地时间相同 选择日期时间('现在','本地时间') 查询
(日期时间('现在''本地时间'))
答案 6 :(得分:3)
如果你想要毫秒精度,试试这个:
CREATE TABLE my_table (
timestamp DATETIME DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);
不过,这会将时间戳保存为文本。
答案 7 :(得分:0)
此替代示例将本地时间存储为Integer以保存20个字节。该工作在字段default,Update-trigger和View中完成。 strftime必须使用“%s”(单引号),因为“%s”(双引号)对我抛出了“ Not Constant”错误。
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