2009-09-06 6 views
8

SQLite दस्तावेज़ निर्दिष्ट करता है कि डीबी में डेटाटाइम मानों को संग्रहीत करने के लिए पसंदीदा प्रारूप जूलियन डे (अंतर्निहित कार्यों का उपयोग करके) का उपयोग करना है।क्या मैं डेटटाइम डेटा को SQLite में जुलिएंड के रूप में संग्रहीत करने से परेशान हूं?

हालांकि, मैंने पाइथन (pysqlite, SQLAlchemy) में देखे गए सभी ढांचे को datetime.datetime मानों को आईएसओ स्वरूपित तारों के रूप में संग्रहीत किया है। वे ऐसा क्यों कर रहे हैं?

मैं आमतौर पर समय-समय पर जूलियंद के रूप में संग्रहीत करने के लिए ढांचे को अनुकूलित करने की कोशिश कर रहा हूं, और यह काफी दर्दनाक है। मुझे संदेह करना शुरू हुआ कि प्रयासों के लायक है।

कृपया मेरे साथ इस क्षेत्र में अपना अनुभव साझा करें। जुलिएंदे के साथ चिपके रहना समझ में आता है?

उत्तर

5

इसे दोनों तरीकों से स्टोर करें। फ्रेमवर्क को उनके तरीकों से सेट किया जा सकता है और यदि आपकी आईएसओ स्वरूपित स्ट्रिंग के साथ कच्चे कॉलम को खोजने की उम्मीद है तो शायद यह इसके लायक होने के आसपास दर्द का अधिक दर्द है।

दो कॉलम रखने में चिंता डेटा स्थिरता है लेकिन स्क्लाइट में इसे काम करने के लिए आवश्यक सब कुछ होना चाहिए। संस्करण 3.3 में चेक बाधाओं और ट्रिगर्स के लिए समर्थन है। date and time functions पर पढ़ें। आपको डेटाबेस में पूरी तरह से जो कुछ चाहिए उसे करने में सक्षम होना चाहिए।

CREATE TABLE Table1 (jd, isotime); 

CREATE TRIGGER trigger_name_1 AFTER INSERT ON Table1 
BEGIN 
    UPDATE Table1 SET jd = julianday(isotime) WHERE rowid = last_insert_rowid(); 
END; 

CREATE TRIGGER trigger_name_2 AFTER UPDATE OF isotime ON Table1 
BEGIN 
    UPDATE Table1 SET jd = julianday(isotime) WHERE rowid = old.rowid; 
END; 

और यदि आप डीबी के भीतर जो कुछ भी चाहते हैं वह नहीं कर सकते हैं तो आप अपनी कार्यक्षमता को पूरा करने के लिए एक सी एक्सटेंशन लिख सकते हैं। इस तरह आपको अपने एक्सटेंशन को लोड करने के अलावा ढांचे को छूने की आवश्यकता नहीं है।

+0

इस सुझाव के लिए धन्यवाद! यह एक अच्छा विचार है और यह इस मुद्दे के साथ मेरी सभी तरह की समस्याओं को हल करता है। –

+1

आप इसे दोनों तरीकों से स्टोर करने के लिए _want_ क्यों करेंगे? आईएसओ-स्वरूपित तारों पर जूलियन दिनों को संग्रहीत करने का एकमात्र असली लाभ संग्रहण स्थान है। यदि आपका ढांचा एक आईएसओ-स्वरूपित स्ट्रिंग की अपेक्षा करता है, तो बस इसका उपयोग करें। SQLite के सभी [डेटाटाइम फ़ंक्शंस] (http://www.sqlite.org/lang_datefunc।एचटीएमएल) जूलियन दिनों के साथ ही आईएसओ तारों को संसाधित कर सकता है। – Martijn

6

जूलियन डे सभी प्रकार की तारीख गणनाओं के लिए आसान है, लेकिन यह समय भाग को निश्चित रूप से स्टोर कर सकता है (सटीक घंटे, मिनट और सेकंड के साथ)। अतीत में मैंने जूलियन डे फ़ील्ड्स (तिथियों के लिए), और सेकेंड-द-द-एपोक (datetime उदाहरणों के लिए) का उपयोग किया है, लेकिन केवल तभी जब मुझे गणना के लिए विशिष्ट आवश्यकताएं थीं (तिथियों और समय के क्रमशः)। आईएसओ स्वरूपित तिथियों और डेटाटाइम्स की सादगी, मुझे लगता है, उन्हें 9 7% समय के बारे में कहना पसंद करते हैं।

+1

तो मैं फ्रेमवर्क के डिफ़ॉल्ट के साथ तब तक रहूंगा जब तक मेरे पास ऐसा करने के स्पष्ट कारण नहीं हैं। धन्यवाद! –

+0

क्या आप कृपया थोड़ी देर का वर्णन कर सकते हैं कि जूलिंदे के घंटों, मिनटों और सेकंड के लिए सटीक क्यों पर्याप्त नहीं है? –

+0

@ स्लावा, "1 सेकंड" का प्रतिनिधित्व करने के बारे में सोचें: वह 1/86400.एक दिन का, जिसे एक डबल परिशुद्धता फ्लोट के अंश भाग के रूप में सटीक रूप से प्रदर्शित नहीं किया जा सकता क्योंकि बाद का प्रतिनिधित्व द्विआधारी रूप में है और 86400 एक नहीं है दो की शक्ति। –

0

क्योंकि 2010-06-22 00:45:56 मानव के लिए 2455369.5318981484 से पढ़ने के लिए कहीं अधिक आसान है। SQLiteSpy या SQLite प्रबंधक में विज्ञापन-संबंधी क्वेरी करने के लिए टेक्स्ट तिथियां बहुत अच्छी हैं।

मुख्य दोष यह है, ज़ाहिर है, कि पाठ दिनांकों 8.

1

लेकिन आम तौर पर करने के बजाय 19 बाइट्स की आवश्यकता है, मानव डेटाबेस से सीधे पढ़ा नहीं है। जूलियन डे पर फ्रैक्शनल टाइम आसानी से मानव पठनीय में परिवर्तित हो जाता है (उदाहरण के लिए)

void hour_time(GenericDate *ConvertObject) 
{ 
    double frac_time = ConvertObject->jd; 
    double hour   = (24.0*(frac_time - (int)frac_time)); 
    double minute  = 60.0*(hour - (int)hour); 
    double second  = 60.0*(minute - (int)minute); 
    double microsecond = 1000000.0*(second - (int)second); 

    ConvertObject->hour   = hour; 
    ConvertObject->minute  = minute; 
    ConvertObject->second  = second; 
    ConvertObject->microsecond = microsecond; 

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

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