2008-10-14 7 views
142

क्या एसकलाइट डेटाबेस में एक तालिका को क्रेट करने के लिए संभव है जिसमें टाइमस्टैम्प कॉलम है जो DATETIME('now') पर डिफ़ॉल्ट है?sqlite डेटाबेस डिफ़ॉल्ट समय मान 'अब'

इस तरह

:

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

यह एक त्रुटि देता है ... कैसे हल करने के लिए?

उत्तर

222

मेरा मानना ​​है कि आप संस्करण 3.1 (source) डॉ के अनुसार

+13

यदि आप भंडारण आकार के बारे में चिंतित हैं, तो ध्यान दें कि यह नुस्खा आपके टाइमस्टैम्प को आईएसओ -8601 (एक टेक्स्ट प्रारूप) में सहेज लेगा, जो प्रति दिन डेटाबेस में लगभग 24 बाइट लेता है।आप केवल एक INTEGER (4) कॉलम का उपयोग कर स्पेस को सहेज सकते हैं, और "इंसर्ट इंटो टेस्ट (टी) मानों (स्ट्रैटाइम ("% s ", CURRENT_TIME) के माध्यम से यूनिक्स समय को संग्रहीत कर सकते हैं;" – mckoss

+2

@mckoss आपकी टिप्पणी के लिए धन्यवाद, निर्माण कथन बन गया: ... mycolumn डिफ़ॉल्ट (strftime ('% s', 'अब')) – larham1

+1

"... डिफ़ॉल्ट (strftime ('% s', 'अब')) "निरंतर अभिव्यक्ति नहीं है, डिफ़ॉल्ट रूप से काम नहीं करेगा" त्रुटि: कॉलम का डिफ़ॉल्ट मान [...] स्थिर नहीं है "। –

71

के रूप में

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

उपयोग कर सकते हैं। हाल ही में एक सूची पोस्ट में हिप:

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

धन्यवाद - मैं सोच रहा था कि कैसे बनाना है यूटीसी – hoju

+0

मेटू के बजाय स्थानीय समय के साथ एक डिफ़ॉल्ट टाइमस्टैम्प, लोकलटाइम पैरामीटर – pihentagy

+0

के लिए धन्यवाद, बहुत बहुत धन्यवाद! मैं 'CURRENT_TIMESTAMP' के प्रारूप से संतुष्ट नहीं था इसलिए मैंने एपोक के बाद से माइक्रोसेकंड की संख्या वापस करने के लिए सी में अपना स्वयं का फ़ंक्शन बनाया, और मुझे खुशी है कि मैं इसे 'डेफॉल्ट' के रूप में उपयोग कर सकता हूं। – Michael

31

यह सिर्फ एक सिंटैक्स त्रुटि है, तो आप कोष्ठक की जरूरत है: (DATETIME('now'))

आप documentation को देखें, तो आप कोष्ठक कि 'expr' चारों ओर जोड़ा जाता है ध्यान दें जाएगा वाक्यविन्यास में विकल्प।

3

यह सिंटेक्स त्रुटि है, क्योंकि आप यदि आप लिखना

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

कोष्टक

नहीं लिखा था (दिनांक ('अब', 'स्थानीयसमय'))

3

यह उपयोग करने के लिए बेहतर हो सकता है स्टोरेज स्पेस को बचाने के लिए असली प्रकार।

उद्धरण 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')) 
); 

की धारा से 1.2 column-constraint देखते हैं।

और insert कोई मूल्य प्रदान किए बिना एक पंक्ति।

INSERT INTO "test" DEFAULT VALUES; 
+0

मैं 'पूर्णांक (एन)' पसंद करता हूं जहां कोई 'n' के लिए उपयुक्त मान चुन सकता है। – user272735

9

यह प्रश्न के अन्य उत्तरों और टिप्पणियों के आधार पर एक पूर्ण उदाहरण है। उदाहरण में टाइमस्टैम्प (created_at -column) unix epoch यूटीसी टाइमज़ोन के रूप में सहेजा गया है और आवश्यक होने पर केवल स्थानीय टाइमज़ोन में परिवर्तित किया गया है।

यूनिक्स युग का उपयोग भंडारण स्थान बचाता है - 4 बाइट्स पूर्णांक बनाम 24 बाइट स्ट्रिंग ISO8601 स्ट्रिंग के रूप में संग्रहीत करते समय, datatypes देखें। यदि 4 बाइट पर्याप्त नहीं हैं जिन्हें 6 या 8 बाइट तक बढ़ाया जा सकता है।

यूटीसी टाइमज़ोन पर टाइमस्टैम्प सहेजना कई टाइमज़ोन पर उचित मूल्य दिखाने के लिए सुविधाजनक बनाता है।

SQLite संस्करण 3.8.6 है जो उबंटू एलटीएस 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 

लोकलटाइम सही है क्योंकि मैं क्वेरी के पल में यूटीसी + 2 डीएसटी में स्थित हूं।

संबंधित मुद्दे