2010-01-21 18 views
8

में डेटाटाइम मानों को स्टोर करने का सबसे अच्छा तरीका मैं SQLite डेटाबेस (डेल्फी और डिस्क्लाइट लाइब्रेरी का उपयोग करके) में डेटाटाइम मान संग्रहीत करूँगा। डीबी की प्रकृति ऐसी है कि इसे कभी भी कंप्यूटर या सिस्टम के बीच स्थानांतरित करने की आवश्यकता नहीं होगी, इसलिए अंतःक्रियाशीलता एक बाधा नहीं है। इसके बजाय मेरा ध्यान गति पढ़ने पर है। डेटाटाइम फ़ील्ड को अनुक्रमित किया जाएगा और मैं इसे बहुत अधिक खोजूंगा, साथ ही अनुक्रम में हजारों डेटाटाइम मानों में पढ़ रहा हूं।SQLite डेटाबेस (डेल्फी)

  • उपयोग वास्तविक डेटा प्रकार और दुकान डेल्फी के TDateTime मूल्यों सीधे:

    के बाद से SQLite datetime मानों के लिए एक स्पष्ट डेटा प्रकार नहीं है, वहाँ कई विकल्प हैं सबसे तेज, लोड हो रहा है पर स्ट्रिंग से कोई रूपांतरण; SQLiteSpy जैसे डीबी मैनेजर का उपयोग करके तिथियों को डीबग करना असंभव है, क्योंकि तिथियां मानव-पठनीय नहीं होंगी। SQLite दिनांक फ़ंक्शंस का उपयोग नहीं कर सकते (?)

  • एक साधारण स्ट्रिंग प्रारूप का उपयोग करें, उदा। YYYYMMDDHHNNSS: रूपांतरण आवश्यक है लेकिन सीपीयू पर अपेक्षाकृत आसान है (विभाजक के लिए स्कैन करने की कोई आवश्यकता नहीं है), डेटा मानव-पठनीय है। अभी भी SQLite दिनांक फ़ंक्शंस का उपयोग नहीं कर सकते हैं।

  • कुछ और करें। क्या करने की सिफारिश की बात है?

मैं http://www.sqlite.org/lang_datefunc.html पढ़ा है लेकिन क्या डेटा प्रकार का उपयोग करने के का कोई उल्लेख नहीं है, और, नहीं औपचारिक रूप से प्रोग्रामिंग में स्कूली जा रहा है, मैं काफी फोकस grok नहीं है पर जूलियन तिथियाँ। अतिरिक्त रूपांतरण क्यों? मैं इन मानों में बहुत कुछ पढ़ रहा हूं, इसलिए स्ट्रिंग्स और टीडीएटीटाइम के बीच कोई भी अतिरिक्त रूपांतरण एक महत्वपूर्ण लागत जोड़ता है।

+0

मैंने http://stackoverflow.com/questions/1933720/how-do-i-insert-datetime-value-into-a-sqlite-डेटाबेस भी देखा है, लेकिन यह मेरे प्रश्न का उत्तर नहीं देता है कि क्या इष्टतम तरीका है, या डेल्फी के TDateTime मानों को सीधे डालने पर आईएसओ स्ट्रिंग प्रारूप (और संबंधित रूपांतरण) को प्राथमिकता देने के लिए वास्तव में एक अनिवार्य कारण है। –

उत्तर

8

आप SQLite समर्थित स्ट्रिंग प्रारूपों में से एक का उपयोग कर सकते हैं, उदाहरण के लिए। YYYY-MM-DD HH:MM:SS.SSS

यह YYYYMMDDHHNNSS जितना आसान होगा - आपको अभी भी विभाजक के लिए स्कैन करने की आवश्यकता नहीं होगी, क्योंकि सभी संख्याएं निश्चित हैं - और आपको SQLite दिनांक फ़ंक्शन समर्थन मिलेगा।

यदि आपको SQLite दिनांक फ़ंक्शन समर्थन की आवश्यकता है, तो मैं उस विधि के साथ जाऊंगा।

यदि नहीं, तो मैं REAL मानों का उपयोग करने की अनुशंसा करता हूं। आप अभी भी एक दूसरे से तुलना कर सकते हैं (उच्च संख्या बाद में समय में हैं), और TDateTime में परिवर्तित किए बिना दिनांक और समय अलग से (दशमलव बिंदु से पहले और बाद में) पर विचार करें।

+0

मैंने सीएसवी और अन्य डेटाबेस के साथ, इस ASCII समाधान का भारी उपयोग किया है, और यह मैं क्या करूँगा। इसके अलावा SQLite तारीख कार्य काम करते हैं। जीत जीत जीतो। –

5

एक समझौता वास्तविक मूल्यों के साथ रहना होगा, लेकिन उन्हें डेल्फी के डेटटाइम टोजुलियनडेट का उपयोग करके जूलियन तिथियों के रूप में स्टोर करना होगा। इस तरह वे पढ़ने के लिए तेज़ रहते हैं, अभिसरण में थोड़ा प्रदर्शन खो गया है, और वे अभी भी एक प्रारूप में हैं जो डेल्फी के बाहर समझ में आता है।

+0

मैंने पहले वास्तविक मूल्यों का उपयोग किया था, एक दोष यह है कि डीबी में मान ** मानव-पठनीय ** नहीं हैं, और SQL उपकरण का उपयोग करके डीबगिंग/विश्लेषण करते समय यह असुविधाजनक है। –

2

इसके लिए मैं आमतौर पर एक इंटीजर डेटा प्रकार का उपयोग करता हूं और यूनिक्स टाइमस्टैम्प मान को समान रूप से स्टोर करता हूं (उदाहरण के लिए 1-1-2000 से eq # सेकंड)। टीडीएटीटाइम से इस टी/की गणना करना 86400 के साथ गुणा/डाइविंग के बराबर है और 'से' के लिए स्थिर जोड़ रहा है।

यदि आपको अधिक सटीकता की आवश्यकता है तो आप डेटटाइम का उपयोग FILETIME (उदाहरण के लिए int64) के रूप में कर सकते हैं जिसमें 100 एनएस वृद्धि होती है। इसके लिए SysUtils में रूपांतरण दिनचर्या हैं और आपका टाइमस्टैम्प यूटीसी में संग्रहीत है।

0

आपकी चिंता डेटाबेस स्तर, आप उदाहरण के लिए दो अलग-अलग क्षेत्रों, स्टोर कर सकते हैं पर केवल मानव पठनीय प्रारूप है:

DELPHI_DATE असली (डबल, यदि संभव हो तो, लेकिन मैं नहीं जानता कि SQLite), इंडेक्स किए गए । आपके सभी प्रोग्रामेटिक प्रश्नों और तुलनाओं को इस क्षेत्र का उपयोग करना चाहिए।

HUMAN_READABLE_DATE वाराकार (23) प्रारूप 'YYYY-MM-DD HH: MM: SS.SSS' प्रारूप के साथ। शायद अनुक्रमित (यदि वास्तव में आवश्यक है)। अधिकांश मानव इनपुट प्रश्नों में इस क्षेत्र को शामिल करना चाहिए और आप SQLite दिनांक कार्यों का उपयोग कर सकते हैं (जैसा कि दूसरों द्वारा कहा गया है)।

यह कुछ कमियां भी हैं: अगर बाहर अद्यतन डेटाबेस में

  • अंतरिक्ष खपत
  • मूल्यों के बीच कोई स्वत: सिंक और नेटवर्क यातायात बढ़ता है,
  • डालने आपरेशन क्योंकि आवश्यक रूपांतरण में थोड़ा और अधिक ले जाएगा, अपने कार्यक्रम

यदि यह आपकी विशेष आवश्यकताओं के लिए उपयुक्त है, तो आप पर निर्भर है।

0

अगर यह जवाब DISqlite पुस्तकालय के लिए लागू है मैं नहीं जानता, लेकिन ...
नीचे कुछ कोड है कि दिखाता है क्या मेरे लिए काम करता दोनों डेल्फी 2010 और टिम एंडरसन के SQLite3 आवरण का उपयोग कर रहा है।

sSQL := 'CREATE TABLE [someTable] (' + 
      ' [somefield1] VARCHAR(12),' + 
      ' [somefield2] VARCHAR(12),' + 
      ' [myDateTime] DATETIME);'; 

एसक्यूएल पॉप्युलेट करने के लिए क्षेत्र:

var 
sDBFilePathString: string; 
sl3tbl: TSqliteTable; 
fsldb : TSQLiteDatabase; 
FromdbDTField : TDateTime; 

begin 
    ... 
    ... 
    fsldb := TSQLiteDatabase.Create(sDBFilePathString); 
    sl3tbl := fsldb.GetTable('SELECT * FROM someTable'); 
    FromdbDateTime := StrToFloat(sl3tbl.FieldAsString(sl3tbl.FieldIndex['myDateTime'])); 
    Showmessage('DT: ' + DateTimeToStr(FromdbDTField)); 
end; 

परिणाम::

**DT: 10/10/2013 1:09:53 AM** 

sSQL := 'INSERT INTO someTable(somefield1, somefield2, myDateTime)' + 
     ' VALUES ("baloney1", "baloney2","' + FloatToStr(Now) + '");'; 

क्षेत्र से डेटा प्राप्त करने का उदाहरण

एसक्यूएल क्षेत्र बनाने के लिए

जैसा कि मैंने पहली पंक्ति पर उल्लेख किया है - मुझे नहीं पता कि यह डिस्क्लाइट लाइब्रेरी के साथ काम करेगा या नहीं, लेकिन अगर यह चीजों को संभालने का एक सुंदर साफ तरीका है। मैं चीजों को सुंदर या अधिक सुरुचिपूर्ण बनाने के लिए इसे छोड़ देता हूं।

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