कैसे DATETIME मान SQLite में काम करते हैं?


110

मैं एंड्रॉइड ऐप बना रहा हूं और सृजन रिकॉर्ड की तारीख / समय को बचाने की आवश्यकता है। SQLite डॉक्स का कहना है, हालांकि, "SQLite में भंडारण की तारीखों और / या समय के लिए अलग भंडारण वर्ग नहीं है" और यह "TEXT, REAL, या INTEGER मानों के रूप में दिनांक और समय संग्रहीत करने में सक्षम है"।

क्या एक प्रकार का दूसरे पर उपयोग करने का एक तकनीकी कारण है? और पंक्ति से पंक्ति के तीन स्वरूपों में से किसी एक कॉलम में तारीखें जमा कर सकते हैं?

मुझे बाद में तारीखों की तुलना करने की आवश्यकता होगी। उदाहरण के लिए, अपने ऐप्स में मैं तारीख बी के बीच आज तक बनाए गए सभी रिकॉर्ड दिखाऊंगा। मुझे चिंता है कि सही डाइट टाइम कॉलम नहीं होने से तुलना मुश्किल हो सकती है।


जवाबों:


83

SQlite में एक विशिष्ट डेटाइम प्रकार नहीं है। आप अपनी आवश्यकताओं के अनुसार TEXT, REALया INTEGERप्रकारों का उपयोग कर सकते हैं।

सीधे डॉक्स से

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

  • ISO8601 स्ट्रिंग्स के रूप में पाठ ("YYYY-MM-DD HH: MM: SS.SSS")।
  • जूलियन दिन की संख्या के रूप में वास्तविक, 24 नवंबर को ग्रीनविच में दोपहर के बाद की संख्या, प्रलेप ग्रेगोरियन कैलेंडर के अनुसार 4714 ईसा पूर्व।
  • Unix Time के रूप में INTEGER, 1970-01-01 से 00:00:00 UTC के बाद के सेकंड की संख्या।

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

SQLite में निर्मित तिथि और समय के कार्य यहां देखे जा सकते हैं


11
नोट करने के लिए महत्वपूर्ण - स्टोर करने की तारीखों के सभी तरीके उन स्वरूपों का उपयोग करते हैं जिनकी तुलना मानक, <,> और BETWEEN ऑपरेटरों के उपयोग से की जा सकती है।
लैरी लस्टिग

2
"SQLite में भंडारण की तारीख और / या समय के लिए अलग भंडारण वर्ग नहीं है" - इसके अलावा इसमें DATE और DATETIME प्रकार होते हैं जिनका कभी प्रलेखन में उल्लेख नहीं किया जाता है
Slabko

12
@Slabko यह नहीं है। SQLite स्तंभ के घोषित प्रकार के रूप में कुछ भी (DATETIME सहित) की अनुमति देता है। उसके आधार पर, यह उस कॉलम को स्टोरेज क्लास के साथ एक आत्मीयता देता है (इसमें यह भी उदाहरण है कि यह कैसे प्रलेखन में DATETIME के ​​लिए काम करता है)। यह आत्मीयता एक संकेत की तरह अधिक है, क्योंकि प्रत्येक प्रविष्टि में स्तंभ वास्तव में एक अलग भंडारण वर्ग हो सकता है। एक संग्रहण वर्ग अभी भी एक प्रकार से कमजोर कदम है और इसे कई प्रकारों द्वारा समर्थित किया जा सकता है। तो हाँ, आप DATETIME का उपयोग कर सकते हैं। नहीं, यह वास्तव में इसे एक प्रकार या भंडारण वर्ग के रूप में समर्थन नहीं करता है। हाँ, प्रलेखन में वास्तव में "DATETIME" शब्द शामिल है।
जैस्पर

20

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

ISO8601 स्ट्रिंग्स के रूप में पाठ ("YYYY-MM-DD HH: MM: SS.SSS")। जूलियन दिन की संख्या के रूप में वास्तविक, 24 नवंबर को ग्रीनविच में दोपहर के बाद की संख्या, प्रलेप ग्रेगोरियन कैलेंडर के अनुसार 4714 ईसा पूर्व। Unix Time के रूप में INTEGER, 1970-01-01 से 00:00:00 UTC के बाद के सेकंड की संख्या। एप्लिकेशन इनमें से किसी भी प्रारूप में दिनांक और समय स्टोर करने के लिए चुना जा सकता है और अंतर्निहित तिथि और समय फ़ंक्शन का उपयोग करके स्वतंत्र रूप से प्रारूपों के बीच परिवर्तित कर सकते हैं।

यह कहने के बाद कि, मैं यूनिक्स युग (1970-01-01 00:00:00 UTC) के बाद से INTEGER और स्टोर सेकंड का उपयोग करूंगा ।


1
मैं भी यही पसंद करता हूं। मानक तिथि / समय से संबंधित कक्षाएं आंतरिक रूप से किसी भी तरह से समर्थित हैं, और यह तुलना करना बहुत आसान है।
करकुरी

1
@dtmilano आप एक स्ट्रिंग के बजाय यहां क्यों पसंद करते हैं?
इगोरगानापल्स्की

1
INTEGER केवल 8 बाइट्स का उपयोग करता है, TEXT इस उदाहरण में 23 बाइट्स का उपयोग कर रहा है। यह स्पष्ट नहीं है कि यह कैसे चुनना है कि यह किस प्रकार के डेटा को संग्रहीत करता है। क्या इसका मतलब यह है कि अगर मैं INTEGER प्रकार का कॉलम बनाता हूं, तो फ़ंक्शन स्वचालित रूप से यूनिक्स समय के रूप में स्टोर हो जाएंगे?
रेयानजेन

2
REAL 8 बाइट्स का उपयोग करता है। 2286 के अंत तक युगांतर सेकंड 10 अंक होंगे, और जब से IEEE डबल 15-17 महत्वपूर्ण अंकों का समर्थन करता है , यह आपको मिलीसेकंड रिज़ॉल्यूशन से बेहतर देता है। RSQLiteऐसा लगता है कि POSIXctसांख्यिक युग में परिवर्तित हो रहा है, इसलिए यह मेरे लिए बहुत अच्छा काम करता है।
r2evans

@ r2evans मुझे यकीन नहीं है कि आप क्या कह रहे हैं। यदि मैं युग के बाद से मिलीसेकंड स्टोर करना चाहता हूं, तो मैं यह कैसे कर सकता हूं?
माइकल

14

SQLite की शक्तिशाली विशेषताओं में से एक आपको भंडारण प्रकार चुनने की अनुमति देता है। तीन अलग-अलग अधिभोगियों में से प्रत्येक के लाभ / हानि:

  • ISO8601 स्ट्रिंग

    • स्ट्रिंग की तुलना मान्य परिणाम देती है
    • स्टोर अंश सेकंड, तीन दशमलव अंक तक
    • अधिक संग्रहण स्थान की आवश्यकता है
    • डेटाबेस ब्राउज़र का उपयोग करते समय आप सीधे इसका मूल्य देखेंगे
    • अन्य उपयोगों के लिए पार्सिंग की आवश्यकता है
    • "डिफ़ॉल्ट current_timestamp" कॉलम संशोधक इस प्रारूप का उपयोग करके स्टोर करेगा
  • वास्तविक संख्या

    • अंश सेकंड के बारे में उच्च परिशुद्धता
    • सबसे लंबी समय सीमा
  • पूर्णांक संख्या

    • सबसे कम संग्रहण स्थान
    • त्वरित संचालन
    • छोटी समय सीमा
    • संभावित वर्ष 2038 समस्या

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


1
2038 समस्या क्यों है? INTEGER 64 बिट स्टोरेज को सपोर्ट करता है।
गुमान बोशेन

1
@ गुरुबॉशेन जहां तक ​​मैं बता सकता हूं, 2038 के बारे में चिंता करने का एकमात्र कारण मेजबान मंच पर समर्थन होगा। SQLite प्रलेखन संदर्भ कार्यान्वयन में C localtime_r()( sqlite.org/lang_datefunc.html#caveats_and_bugs ) का उपयोग करने का दावा करता है , और localtime()संभवतया 2038 के लिए असुरक्षित हो सकता है यदि होस्ट प्लेटफ़ॉर्म में 32-बिट है time_t। कहा कि, चूंकि SQLite सुरक्षित सीमा पूर्व-रूपांतरण (समान लिंक देखें) में तारीखों के बाहर मैपिंग करके इस संभावना के खिलाफ गार्ड होने का दावा करता है, मुझे लगता है कि यह गूढ़ मामलों में शायद छोड़कर एक मुद्दा होने की संभावना नहीं है।
Zoë Sparks

@ ZoëSparks स्पष्टीकरण के लिए धन्यवाद।
गुमान बोशेन

7

व्यावहारिक रूप से सभी दिनांक और समय के मामलों के लिए मैं चीजों को सरल करना पसंद करता हूं, बहुत, बहुत सरल ... पूर्णांक में संग्रहीत सेकंड से नीचे।

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

इस तरह से करने पर, आपको चिंता करने की ज़रूरत नहीं है जब [वर्तमान पसंदीदा डेटाबेस यहाँ डालें] को [भविष्य के पसंदीदा डेटाबेस] से बदल दिया जाता है, जो संयोग से आज आपके द्वारा चुने गए तारीख प्रारूप का उपयोग नहीं करता है।

यह सिर्फ एक छोटा सा गणित उपरि है (उदाहरण के लिए। विधियाँ - दो सेकंड लगते हैं, यदि आवश्यक हो तो मैं एक जिस्ट पोस्ट करूँगा) और बाद के समय / समय के बारे में बहुत सारे कार्यों के लिए चीजों को सरल बनाता हूँ।


7

इसे एक प्रकार के क्षेत्र में संग्रहीत करें long। देखें Date.getTime()औरnew Date(long)


मैं कैसे तुलना कर सकते हैं ?? क्या आप मुझे क्वेरी का नमूना दे सकते हैं ..: D
खैरिल उशन

कोड ( joda-time.sourceforge.net ) में तुलना के लिए Joda Time को देखें और SQL में सरल लंबी तुलना (जैसे संख्यात्मक तुलना) का उपयोग करें।
सिंटेक्स

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