sqlite डेटाबेस डिफ़ॉल्ट समय मान 'अब'


190

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

ऐशे ही:

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

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

जवाबों:


290

मुझे विश्वास है कि आप उपयोग कर सकते हैं

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

संस्करण 3.1 के रूप में ( स्रोत )


22
यदि आप भंडारण आकार के बारे में चिंतित हैं, तो ध्यान दें कि यह नुस्खा ISO-8601 (एक पाठ प्रारूप) में आपके टाइमस्टैम्प को बचाएगा, डेटाबेस में प्रति दिनांक लगभग 24 बाइट्स ले रहा है। आप केवल एक INTEGER (4) कॉलम का उपयोग करके और "INSERT INTO परीक्षण (t) मान (स्ट्रैफ़ाइम ("% s ", CURRENT_TIME)) के माध्यम से यूनिक्स समय संग्रहीत करके अंतरिक्ष को बचा सकते हैं;"
फॉक

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

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

@mckoss अच्छा है, लेकिन SQLite "INTEGER" के बाद "(4)" को अनदेखा करता है। SQLite प्रलेखन: SQLite संस्करण 3 में डेटाटाइप्स कहते हैं, "कोष्ठक में सांख्यिक तर्क जो निम्न प्रकार का नाम है। SQLite द्वारा अनदेखा किया जाता है" और यह कि परिमाण पर "INTEGER" भंडारण वर्ग का मान रखने के लिए उपयोग किए जाने वाले बाइट्स की संख्या "निर्भर करती है" मूल्य का "। तो, मुझे लगता है कि आप सही कह रहे हैं कि SQLite इसे केवल 4 बाइट्स के साथ संग्रहीत करेगा, लेकिन वर्ष 2038 तक, इसे 6 बाइट्स का उपयोग करना होगा - उम्मीद है, कंप्यूटर तब तक कोड कर सकते हैं - और वर्ष 4461642 तक 8 बाइट्स।
ma11hew28

94

डॉ के अनुसार। एक हालिया सूची पोस्ट में hipp:

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

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


18

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

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

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

SQLite संस्करण 3.8.6 है जो कि 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

स्थानीय समय सही है क्योंकि मैं क्वेरी के क्षण में UTC + 2 DST पर स्थित हूं।


7

स्टोरेज स्पेस को बचाने के लिए REAL टाइप का इस्तेमाल करना बेहतर हो सकता है।

SQLite संस्करण 3 में डेटाटाइप्स के 1.2 खंड से उद्धरण

SQLite में दिनांक और / या समय संग्रहीत करने के लिए भंडारण वर्ग अलग से सेट नहीं है। इसके बजाय, बिल्ट-इन डेट और टाइम फंक्शन्स ऑफ SQLite, TEXT, REAL, या INTERER मानों के रूप में दिनांक और समय संग्रहीत करने में सक्षम हैं।

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

स्तंभ-बाधा देखें ।

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

INSERT INTO "test" DEFAULT VALUES;

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

4

यह सिंटैक्स त्रुटि है क्योंकि आपने कोष्ठक नहीं लिखा था

अगर तुम लिखो

डेटाइम ('अभी') का चयन करें, तो यह आपको utc समय देगा लेकिन यदि आप इसे क्वेरी लिखते हैं तो आपको इससे पहले कोष्ठक जोड़ना होगा (UTC) समय के लिए (डेटाइम ('अब'))। स्थानीय समय के लिए ही क्वेरी के लिए डेटाइमटाइम ('अब', 'स्थानीय समय') चुनें

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


1

यह वैकल्पिक उदाहरण 20 बाइट्स को बचाने के लिए स्थानीय समय को इंटेगर के रूप में संग्रहीत करता है। कार्य फ़ील्ड डिफ़ॉल्ट, अद्यतन-ट्रिगर और दृश्य में किया जाता है। 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.