2011-03-26 25 views
6

मैं SQLite में काम कर रहा हूं इसलिए मैं तारीखों को केवल पाठ के रूप में संग्रहीत कर रहा हूं।स्ट्रिंग/टेक्स्ट के रूप में संग्रहीत तारीखों की तुलना सीधे तुलना की जा सकती है?

YYYY-MM-DD hh:mm:ss

जहां तक ​​मेरा निर्धारित कर सकते हैं, मैं उन्हें आदेश या उन्हें एक दूसरे के साथ तुलना करने के लिए सक्षम होना चाहिए बस के रूप में वे सिर्फ नंबर की तरह, तारीख कार्यों के बारे में चिंता नहीं कर रहे हैं के बाद से किसी भी incrementing सही शुरू होता है और चाल छोड़ दिया , और सभी मान संख्यात्मक हैं, और गैर-संख्यात्मक वर्ण हमेशा मानकीकृत होते हैं और मैं 24 घंटे का समय उपयोग कर रहा हूं।

मैं लोगों को ऑनलाइन किसी भी तुलना के लिए पाठ के रूप में परिवर्तित करने के तरीके को देखता रहता हूं, लेकिन मुझे नहीं लगता कि वे क्यों काम नहीं करेंगे-इतने लंबे समय तक कि वे उस महानतम में हैं -> सबसे छोटा आदेश। जाहिर है, मैं गणित नहीं कर सकता, लेकिन Select DateTime From Table where DateTime > 2010-04-21 15:34:55 पूरी तरह से विश्वसनीय होना चाहिए, है ना?

क्या कोई अपवाद है जिसके बारे में मैं सोच नहीं रहा हूं?

उत्तर

3

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

इसके अलावा, कुछ अन्य डेटाबेसों में अस्पष्ट तारीख-टू-स्ट्रिंग फ़ंक्शंस (मैं आपको देख रहा हूं, SQL Server), जहां यह पता लगाना मुश्किल है कि एक क्रमबद्ध दिनांक स्ट्रिंग कैसे प्राप्त करें। SQLite का डिफ़ॉल्ट दिनांक प्रारूप (YYYY-MM-DD HH: NN: SS) पूरी तरह से क्रमबद्ध और पढ़ने में आसान है।

जब आप सही प्रारूप का उपयोग करते हैं, जैसे आप प्रस्तुत कर रहे हैं, तब तक आप टेक्स्ट तिथियों के साथ ठीक काम करेंगे।

वास्तव में, आप SQLite के date and time functions का उपयोग करके गणित भी कर सकते हैं; वे बल्कि अपरंपरागत लेकिन आश्चर्यजनक रूप से लचीला हैं।

+0

ठीक है! मुझे कोई कारण नहीं दिख रहा था कि यह ऐसा क्यों नहीं करेगा ... – Damon

5

यह ठीक काम करता है। SQLite में वास्तविक दिनांक (या DATETIME) डेटा प्रकार नहीं है जैसे कई अन्य डेटाबेस करते हैं। आपके विकल्प दिनांक को एक स्ट्रिंग प्रारूप में संग्रहीत करना है जो ठीक से सॉर्ट करेगा (YYYY-MM-DD या YYYY-MM-DD hh: mm: ss) या तारीख को किसी संख्या में कनवर्ट करने और इसके बजाय स्टोर करने के लिए।

आप स्ट्रिंग प्रारूप का उपयोग करते हैं, तो आप निश्चित रूप से उद्धरण शामिल करने के लिए है:

SELECT DateTime FROM Table WHERE DateTime > '2010-04-21 15:34:55' 
+1

सुपर, एकल उद्धरण में स्ट्रिंग डालने की चाल ने मेरा दिन बचाया। समाधान की तलाश में है .. धन्यवाद – Saqib

1

वे पाठ के रूप में जब तक वास्तविक मान क्या आप उन्हें होने की उम्मीद कर रहे हैं तुलना की जा सकती। यही समस्या है।

टेक्स्ट के रूप में तारीखों की तुलना कैंची के साथ चलने की तरह है। लेकिन SQLite आपको हर समय कैंची के साथ चलाता है। जब आप की तरह '2011-31-31 08:63:00' डालने या अद्यतन मूल्यों करने की कोशिश

sqlite> create table test (d1 datetime primary key); 
sqlite> insert into test values ('2011-31-31 08:63:00'); 
sqlite> select * from test; 
2011-31-31 08:63:00 

एक डीबीएमएस कि SQL मानकों के अनुरूप एक "सीमा से बाहर" त्रुटि को बढ़ा देंगे। लेकिन SQLite आपको कुछ भी डालने देता है। आप डेटाटाल कॉलम में 'कैटकॉल' भी डाल सकते हैं। (इसे आज़माएं।)

SQLite आपको पाठ का उपयोग करते हुए "कैंची के साथ चल रहा है" व्यवहार देता है।

sqlite> create table test (d1 varchar(25) primary key); 
sqlite> insert into test values ('2011-31-31 08:63:00'); 
sqlite> select * from test; 
2011-31-31 08:63:00 

यदि मूल्य नहीं हैं जो आप उन्हें उम्मीद करते हैं, तो आपको निम्न प्रकार के व्यवहार को देखने की संभावना है।

sqlite> create table test (d1 varchar(25), d2 varchar(25)); 
sqlite> insert into test values ('2011-01-01 08:00:00', '2011-01-01 08:15:00'); 
sqlite> select d1<d2 from test; 
1 
sqlite> update test set d2 = '2011+01-01 08:15:00'; 
sqlite> select d1<d2 from test; 
0 
+0

निष्पक्ष होने के लिए, 'Catcall' को SQLite में 'डेटाटाइम' कॉलम में कभी नहीं डाला जाता है; बल्कि, कॉलम एक टेक्स्ट कॉलम होगा। और जब तक हम कैंची के साथ चल रहे हैं, आप वर्चर (25) कॉलम में जितना चाहें उतना टेक्स्ट डाल सकते हैं क्योंकि SQLite परिभाषित 25 चार सीमा का पालन नहीं करेगा। –

1

यदि आप जो भी कर रहे हैं वह collating और खोज है, तो आपको ठीक होना चाहिए। लोग इस प्रारूप का उपयोग उस नाम के लिए फ़ाइल नामों के साथ वर्षों से कर रहे हैं। यदि आपको गणना करने वाली चीजों को करने की आवश्यकता है (जैसे किसी विशिष्ट तारीख के तीस दिनों के भीतर सभी रिकॉर्ड ढूंढना) तो इसे केवल तोड़ना शुरू करना चाहिए।

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