Đây là ví dụ đầy đủ dựa trên các câu trả lời và nhận xét khác cho câu hỏi. Trong ví dụ, dấu thời gian (created_at
-column) được lưu dưới dạng unix epoch múi giờ UTC và chuyển thành múi giờ địa phương chỉ khi cần thiết.
Sử dụng unix epoch tiết kiệm dung lượng lưu trữ - 4 byte số nguyên so với chuỗi 24 byte khi được lưu trữ dưới dạng chuỗi ISO8601, xem datatypes. Nếu 4 byte không đủ có thể tăng lên 6 hoặc 8 byte.
Lưu dấu thời gian trên múi giờ UTC giúp thuận tiện để hiển thị giá trị hợp lý trên nhiều múi giờ.
Phiên bản SQLite là 3.8.6 đi kèm với Ubuntu LTS 14.04.
$ 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
Giờ địa phương là chính xác khi tôi đặt tại UTC + 2 DST tại thời điểm truy vấn.
Nếu bạn lo lắng về dung lượng lưu trữ, lưu ý rằng công thức này sẽ lưu dấu thời gian của bạn theo ISO-8601 (định dạng văn bản), chiếm khoảng 24 byte trong cơ sở dữ liệu mỗi ngày.Bạn có thể tiết kiệm không gian bằng cách sử dụng một cột INTEGER (4) và lưu trữ thời gian unix thông qua các giá trị "INSERT INTO test (t)" (strftime ("% s", CURRENT_TIME)); " – mckoss
@mckoss nhờ nhận xét của bạn, câu lệnh create đã trở thành: ... mycolumn default (strftime ('% s', 'now')) – larham1
"... default (strftime ('% s', 'now')) "không phải là biểu thức liên tục, sẽ không hoạt động với mặc định cho" Lỗi: giá trị mặc định của cột [...] không phải là hằng số ". –