कैसे SQLite में एक स्वचालित टाइमस्टैम्प है?


132

मेरे पास एक SQLite डेटाबेस है, संस्करण 3 और मैं इस डेटाबेस का उपयोग करने वाले एप्लिकेशन बनाने के लिए C # का उपयोग कर रहा हूं।

मैं समसामयिक के लिए एक तालिका में टाइमस्टैम्प क्षेत्र का उपयोग करना चाहता हूं, लेकिन मुझे लगता है कि जब मैं एक नया रिकॉर्ड सम्मिलित करता हूं, तो यह फ़ील्ड सेट नहीं है, और अशक्त है।

उदाहरण के लिए, एमएस एसक्यूएल सर्वर में अगर मैं टाइमस्टैम्प क्षेत्र का उपयोग करता हूं तो यह डेटाबेस द्वारा अपडेट किया जाता है, मुझे खुद से सेट नहीं करना है। क्या यह SQLite में संभव है?

जवाबों:


212

किसी फ़ील्ड के लिए बस एक डिफ़ॉल्ट मान घोषित करें:

CREATE TABLE MyTable(
    ID INTEGER PRIMARY KEY,
    Name TEXT,
    Other STUFF,
    Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);

हालाँकि, यदि आपकी INSERTकमांड स्पष्ट रूप से इस फ़ील्ड को सेट करती है NULL, तो इसे सेट किया जाएगा NULL


5
यह SQL सर्वर के टाइमस्टैम्प के बराबर नहीं है क्योंकि यह सिस्टम घड़ी पर आधारित है; यदि आप घड़ी बदलते हैं, तो मान पीछे की ओर जा सकता है। SQL सर्वर में, टाइमस्टैम्प मान हमेशा बढ़ रहे हैं।
रोरी मैकलेड

26
@ मैथ्यू कोई DATETIME डेटा प्रकार नहीं है, लेकिन SQLite फ़ील्ड प्रकार के रूप में कुछ भी स्वीकार करता है ।
सीएल।

4
@Matthieu लिंक में SQLite में DATETIME डेटाटाइप का उल्लेख किया गया है, जिसे आपने प्रदान किया है। 2.2 आत्मीयता के नाम उदाहरण पढ़ें
रफीक मोहम्मद

6
यह अद्यतन विवरण को कवर करने के लिए प्रतीत नहीं होता है। ऐसा लगता है कि ट्रिगर ऐसा करने का एकमात्र तरीका है।
डेल एंडरसन

2
@CL क्षमा करें, आप सही हैं। मैंने आपके उत्तर को गलत तरीके से मिला दिया और javed का। DEFAULT (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW', 'localtime'))एक के साथ वास्तव में सार्थक microsecond मूल्यों हो जाता है।
डायटमार

71

आप SQLite पर तालिका में TIMESTAMP फ़ील्ड बना सकते हैं, इसे देखें:

CREATE TABLE my_table (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    name VARCHAR(64),
    sqltime TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
);

INSERT INTO my_table(name, sqltime) VALUES('test1', '2010-05-28T15:36:56.200');
INSERT INTO my_table(name, sqltime) VALUES('test2', '2010-08-28T13:40:02.200');
INSERT INTO my_table(name) VALUES('test3');

यह परिणाम है:

SELECT * FROM my_table;

यहाँ छवि विवरण दर्ज करें


गैर-स्थिर डिफ़ॉल्ट (ALTER TABLE "मुख्य" के साथ एक कॉलम नहीं जोड़ा जा सकता है। "xxx_data" ADD COLUMN "ने बनाया_डेट को" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP)
toing_toing

14

स्वचालित डेटाइम पूरा होने का एक कार्य उदाहरण datefunc पढ़ना होगा:

sqlite> CREATE TABLE 'test' ( 
   ...>    'id' INTEGER PRIMARY KEY,
   ...>    'dt1' DATETIME NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP, 'localtime')), 
   ...>    'dt2' DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime')), 
   ...>    'dt3' DATETIME NOT NULL DEFAULT (strftime('%Y-%m-%d %H:%M:%f', 'now', 'localtime'))
   ...> );

आइए कुछ पंक्तियों को इस तरह से डालें जो स्वचालित डेटाइम पूरा करने की पहल करें:

sqlite> INSERT INTO 'test' ('id') VALUES (null);
sqlite> INSERT INTO 'test' ('id') VALUES (null);

संग्रहीत डेटा स्पष्ट रूप से दिखाता है कि पहले दो समान हैं लेकिन तीसरा फ़ंक्शन नहीं है:

sqlite> SELECT * FROM 'test';
1|2017-09-26 09:10:08|2017-09-26 09:10:08|2017-09-26 09:10:08.053
2|2017-09-26 09:10:56|2017-09-26 09:10:56|2017-09-26 09:10:56.894

ध्यान दें कि SQLite फ़ंक्शन कोष्ठक में घिरे हुए हैं! इसे एक उदाहरण में दिखाना कितना मुश्किल था?

मज़े करो!


7

आप ट्रिगर्स का उपयोग कर सकते हैं। बहुत अच्छा काम करता है

CREATE TABLE MyTable(
ID INTEGER PRIMARY KEY,
Name TEXT,
Other STUFF,
Timestamp DATETIME);


CREATE TRIGGER insert_Timestamp_Trigger
AFTER INSERT ON MyTable
BEGIN
   UPDATE MyTable SET Timestamp =STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') WHERE id = NEW.id;
END;

CREATE TRIGGER update_Timestamp_Trigger
AFTER UPDATE On MyTable
BEGIN
   UPDATE MyTable SET Timestamp = STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW') WHERE id = NEW.id;
END;

6

उपरोक्त उत्तर देने के लिए ...

यदि आप EF का उपयोग कर रहे हैं, तो प्रॉपर्टी को डेटा एनोटेशन [टाइमस्टैम्प] के साथ सुशोभित करें, फिर अपने संदर्भ वर्ग के अंदर अति-ऑनमॉडेलक्रीटिंग पर जाएं, और इस धाराप्रवाह एपीआई कोड को जोड़ें:

modelBuilder.Entity<YourEntity>()
                .Property(b => b.Timestamp)
                .ValueGeneratedOnAddOrUpdate()
                .IsConcurrencyToken()
                .ForSqliteHasDefaultValueSql("CURRENT_TIMESTAMP");

यह हर उस डेटा को एक डिफ़ॉल्ट मान देगा जो इस तालिका में डाला जाएगा।


जानिए, Xamarin ऐप में, Android पर Entity कैसा प्रदर्शन करती है? परीक्षण के लिए चारों ओर नहीं मिला है, हालांकि DAL के साथ प्रतिस्थापित करना अच्छा होगा।
Samis

मुझे sqliteHasDefault के लिए आवश्यक पैकेज नहीं मिला। आप जानते हैं कि मुझे कौन सा पैकेज नगेट से प्राप्त करना है?
सिमंस0n

@ Simons0n, इस Microsoft.EntityFrameworkCore.Metadata.Builders.PropertyBuilder नाम स्थान का उपयोग करने का प्रयास करें।
राफेल

2

आप कस्टम डेटाइम का उपयोग करके उपयोग कर सकते हैं ...

 create table noteTable3 
 (created_at DATETIME DEFAULT (STRFTIME('%d-%m-%Y   %H:%M', 'NOW','localtime')),
 title text not null, myNotes text not null);

वर्तमान प्रणाली की तारीख पाने के लिए 'अब', 'स्थानीय समय' का उपयोग करें, यह आपके डेटाबेस में प्रविष्टि समय के बाद आपके डेटाबेस में कुछ अतीत या अन्य समय दिखाएगा।

धन्यवाद...


1
उपयोगी है यदि आपको माइक्रोसेकंड की आवश्यकता है; आप DEFAULT (STRFTIME ('% Y-% m-% d% H:% M:% f', 'Now', 'localtime')) का उपयोग कर सकते हैं। केवल यह कहते हुए DEFAULT CURRENT_TIMESTAMP आपको केवल एक सेकंड की एक ग्रैन्युलैरिटी देगा।
डायटमार

यह निश्चित रूप से काम करता है! कोष्ठक के साथ घिरे () के लिए ध्यान देना!
सेंटुरियन

0

यदि आप SQLite DB-Browser का उपयोग करते हैं, तो आप इस तरह से डिफ़ॉल्ट मान बदल सकते हैं:

  1. डेटाबेस संरचना चुनें
  2. तालिका का चयन करें
  3. संशोधित तालिका
  4. अपने कॉलम में 'डिफ़ॉल्ट मान' मान के अंतर्गत: = (डेटाटाइम ('अभी', 'स्थानीय समय'))

मैं आपके डेटाबेस को पहले अपडेट करने की सलाह देता हूं, क्योंकि मूल्य में एक गलत प्रारूप SQLLite ब्राउज़र में समस्याएं पैदा कर सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.