2008-10-14 23 views
142

bir zaman damgası sütunu olan bir tablo oluşturmaya yönelik bir sqlite veritabanında mümkün mü olduğunu DATETIME('now') varsayılan? Bunun gibisqlite veritabanı varsayılan zaman değeri 'şimdi'

:

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

... Nasıl çözülür?

cevap

222

i sürüm 3.1 dr göre (source)

+13

, bu tarifi tarihinden başına veritabanında yaklaşık 24 bayt kaplıyor, ISO-8601 (bir metin formatı) da damgaları kurtaracak unutmayın." "(CURRENT_TIME) yalnızca bir tamsayı (4) kolonu kullanılarak ve% s teste (t) değerlerinin strftime();" INSERT" üzerinden UNIX zaman depolayarak yer tasarruf Yorumunuza teşekkür @mckoss – mckoss

+2

oluşturmak ifadesi oldu: ... Sütunum default (strftime ('% s', 'şimdi')) – larham1

+1

..." varsayılan (strftime ('% s', 'şimdi')) Error "sabit ifade değil, varsayılan vererek işe yaramaz ': sütunun varsayılan değer [...]' sabit değildir. –

71

itibariyle

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

kullanabilirsiniz inanıyoruz. son liste yayında hipp:

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

teşekkür - Ben nasıl oluşturulacağını merak yerine UTC – hoju

+0

metoo daha yerel zamanla varsayılan bir zaman damgası, localtime parametresi – pihentagy

+0

için teşekkürler çok teşekkür ederim! 'CURRENT_TIMESTAMP' formatından memnun değildim, böylece Epoch'dan bu yana mikro saniye sayısını döndürmek için C'deki kendi işlevimi oluşturdum ve şimdi bunu bir "DEFAULT" olarak kullanabileceğime sevindim. – Michael

31

, anlatabiliyor parantez gerek sadece sözdizimi hatası: Eğer documentation bakarsak (DATETIME('now'))

, sen 'ifade' etrafında eklenir parantez dikkat edeceğiz sözdiziminde seçenek. Eğer

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

yazarsanız parantez

yazmadım çünkü

3

Bu yazım hatasıdır (datetime ('Şimdi', 'localtime'))

3

Kullanımı daha iyi olabilir GERÇEK tipi, depolama alanından tasarruf etmek için.

Alıntı

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

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

Datatypes In SQLite Version 3 bölümü 1.2'den column-constraint bkz. Herhangi bir değer sağlamadan bir satır

Ve insert.

INSERT INTO "test" DEFAULT VALUES; 
+0

I 'tam sayı (n) tercih' bir 'n' için müsait bir değer almak için burada. – user272735

9

Bu soruya diğer cevaplar ve açıklamalara dayanarak tam bir örnektir. Örnekte, zaman damgası (created_at-kodlama), unix epoch UTC saat dilimi olarak kaydedilir ve yalnızca gerektiğinde yerel saat dilimine dönüştürülür. 24 bayt dize vs 4 bayt tamsayı ISO8601 dizesi olarak saklandığında, datatypes bakınız - Unix Zaman Kullanımı

depolama alanı kazandırır. 4 bayt yeterli değilse, 6 veya 8 bayta arttırılabilir.

UTC zaman dilimi üzerinde zaman damgasının kaydedilmesi, çok sayıda saat dilimi üzerinde makul bir değer göstermeyi kolaylaştırır.

SQLite sürümü Ubuntu LTS 14.04 ile 3.8.6 olduğu gemi olduğunu.

$ 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 

Bulunduğunda, UTC + 2 DST adresinde bulunduğum şekliyle doğrudur. Depolama boyutu ile ilgili endişeleriniz varsa

İlgili konular