2008-10-14 27 views

Trả lời

222

tôi tin rằng bạn có thể sử dụng

CREATE TABLE test (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    t TIMESTAMP 
    DEFAULT CURRENT_TIMESTAMP 
); 

như các phiên bản 3,1 (source)

+13

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

+2

@mckoss nhờ nhận xét của bạn, câu lệnh create đã trở thành: ... mycolumn default (strftime ('% s', 'now')) – larham1

+1

"... 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ố ". –

71

theo dr. Hipp trong một bài đăng danh sách gần đây:

CREATE TABLE whatever(
    .... 
    timestamp DATE DEFAULT (datetime('now','localtime')), 
    ... 
); 
+0

cảm ơn - Tôi đã tự hỏi làm thế nào để tạo ra dấu thời gian mặc định với giờ địa phương thay vì UTC – hoju

+0

Metoo, cảm ơn tham số giờ địa phương – pihentagy

+0

Cảm ơn bạn rất nhiều! Tôi không hài lòng với định dạng 'CURRENT_TIMESTAMP' vì vậy tôi đã tạo hàm của riêng mình trong C để trả về số micro giây kể từ thời đại Epoch, và tôi rất vui vì bây giờ tôi có thể sử dụng nó như là một' DEFAULT'. – Michael

31

Nó chỉ là một lỗi cú pháp, bạn cần ngoặc: (DATETIME('now'))

Nếu bạn nhìn vào documentation, bạn sẽ lưu ý các dấu ngoặc đơn được thêm vào xung quanh 'expr' tùy chọn trong cú pháp.

3

Đó là lỗi cú pháp bởi vì bạn đã không viết ngoặc

nếu bạn viết

Select datetime('now') then it will give you utc time but if you this write it query then you must add parenthesis before this so (datetime('now')) for UTC Time. for local time same Select datetime('now','localtime') for query

(datetime ('bây giờ', 'localtime'))

3

Nó có thể là tốt hơn để sử dụng REAL loại, để tiết kiệm không gian lưu trữ.

Trích từ 1,2 phần của Datatypes In SQLite Version 3

SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values

CREATE TABLE test (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    t REAL DEFAULT (datetime('now', 'localtime')) 
); 

thấy column-constraint.

insert một hàng mà không cung cấp bất kỳ giá trị nào.

INSERT INTO "test" DEFAULT VALUES; 
+0

Tôi thích 'số nguyên (n)' trong đó người ta có thể chọn giá trị phù hợp cho 'n'. – user272735

9

Đâ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.

Các vấn đề liên quan