SQLite दिनांक को संग्रहीत करने के लिए पाठ, वास्तविक या पूर्णांक डेटा प्रकारों का उपयोग कर सकता है। इससे भी अधिक, जब भी आप कोई क्वेरी करते हैं, तो परिणाम प्रारूप का उपयोग करके दिखाए जाते हैं %Y-%m-%d %H:%M:%S
।
अब, यदि आप SQLite दिनांक / समय फ़ंक्शन का उपयोग करते हुए दिनांक / समय मान सम्मिलित करते हैं, तो आप वास्तव में मिलीसेकंड को भी स्टोर कर सकते हैं। यदि ऐसा है, तो परिणाम प्रारूप का उपयोग करके दिखाए जाते हैं %Y-%m-%d %H:%M:%f
। उदाहरण के लिए:
sqlite> create table test_table(col1 text, col2 real, col3 integer);
sqlite> insert into test_table values (
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123'),
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123'),
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123')
);
sqlite> insert into test_table values (
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.126'),
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.126'),
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.126')
);
sqlite> select * from test_table;
2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126
अब, सत्यापित करने के लिए कुछ प्रश्न करना कि क्या हम वास्तव में समय की तुलना करने में सक्षम हैं:
sqlite> select * from test_table /* using col1 */
where col1 between
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.121') and
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.125');
2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
आप एक ही जांच कर सकते हैं SELECT
का उपयोग कर col2
और col3
और आप एक ही परिणाम मिलेंगे। जैसा कि आप देख सकते हैं, दूसरी पंक्ति (126 मिलीसेकंड) वापस नहीं है।
ध्यान दें कि BETWEEN
समावेशी है, इसलिए ...
sqlite> select * from test_table
where col1 between
/* Note that we are using 123 milliseconds down _here_ */
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.123') and
strftime('%Y-%m-%d %H:%M:%f', '2014-03-01 13:01:01.125');
... उसी सेट पर लौटेंगे।
विभिन्न तिथि / समय सीमाओं के साथ खेलने की कोशिश करें और सब कुछ उम्मीद के मुताबिक व्यवहार करेगा।
बिना strftime
फंक्शन के क्या ?
sqlite> select * from test_table /* using col1 */
where col1 between
'2014-03-01 13:01:01.121' and
'2014-03-01 13:01:01.125';
2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
बिना strftime
फंक्शन और बिना मिलीसेकंड के क्या?
sqlite> select * from test_table /* using col1 */
where col1 between
'2014-03-01 13:01:01' and
'2014-03-01 13:01:02';
2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126
किस बारे में ORDER BY
?
sqlite> select * from test_table order by 1 desc;
2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126
2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
sqlite> select * from test_table order by 1 asc;
2014-03-01 13:01:01.123|2014-03-01 13:01:01.123|2014-03-01 13:01:01.123
2014-03-01 13:01:01.126|2014-03-01 13:01:01.126|2014-03-01 13:01:01.126
ठीक काम करता है।
अंत में, जब एक कार्यक्रम के भीतर वास्तविक संचालन के साथ काम कर रहा है (बिना साइक्लाइट निष्पादन योग्य ...)
BTW: मैं JDBC (अन्य भाषाओं के बारे में निश्चित नहीं) का उपयोग कर रहा हूँ ... xerial से sqlite-jdbc ड्राइवर v3.7.2 - शायद नए संशोधन नीचे बताए गए व्यवहार को बदल दें ... यदि आप Android में विकसित कर रहे हैं, तो आप नहीं करते। एक jdbc- ड्राइवर की आवश्यकता है। सभी SQL संचालन का उपयोग कर प्रस्तुत किया जा सकता है SQLiteOpenHelper
।
JDBC विभिन्न तरीकों में किसी डेटाबेस की वास्तविक तिथि / समय मान प्राप्त करने के लिए है: java.sql.Date
, java.sql.Time
, और java.sql.Timestamp
।
संबंधित तरीकों में java.sql.ResultSet
(जाहिर है) कर रहे हैं getDate(..)
, getTime(..)
और getTimestamp()
क्रमशः।
उदाहरण के लिए:
Statement stmt = ... // Get statement from connection
ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_TABLE");
while (rs.next()) {
System.out.println("COL1 : "+rs.getDate("COL1"));
System.out.println("COL1 : "+rs.getTime("COL1"));
System.out.println("COL1 : "+rs.getTimestamp("COL1"));
System.out.println("COL2 : "+rs.getDate("COL2"));
System.out.println("COL2 : "+rs.getTime("COL2"));
System.out.println("COL2 : "+rs.getTimestamp("COL2"));
System.out.println("COL3 : "+rs.getDate("COL3"));
System.out.println("COL3 : "+rs.getTime("COL3"));
System.out.println("COL3 : "+rs.getTimestamp("COL3"));
}
// close rs and stmt.
चूंकि SQLite में वास्तविक DATE / TIME / TIMESTAMP डेटा नहीं है, इसलिए ये सभी 3 विधियां मान लौटाती हैं जैसे कि ऑब्जेक्ट को 0 से प्रारंभ किया गया था:
new java.sql.Date(0)
new java.sql.Time(0)
new java.sql.Timestamp(0)
तो, सवाल यह है: हम वास्तव में दिनांक / समय / टाइमस्टैम्प ऑब्जेक्ट का चयन, सम्मिलित या अद्यतन कैसे कर सकते हैं? कोई आसान जवाब नहीं है। आप विभिन्न संयोजनों को आज़मा सकते हैं, लेकिन वे आपको सभी SQL कथनों में SQLite फ़ंक्शन एम्बेड करने के लिए बाध्य करेंगे। पाठ को अपने जावा प्रोग्राम के अंदर दिनांक ऑब्जेक्ट में बदलने के लिए उपयोगिता वर्ग को परिभाषित करना बहुत आसान है। लेकिन हमेशा याद रखें कि SQLite UTC + 0000 के लिए किसी भी दिनांक मान को बदल देता है।
संक्षेप में, हमेशा सही डेटा प्रकार का उपयोग करने के सामान्य नियम के बावजूद, या, यहां तक कि यूनिक्स समय (मिली के बाद से मिलीसेकंड) को पूर्ण करने वाले पूर्णांक, मुझे डिफ़ॉल्ट SQLite प्रारूप ( '%Y-%m-%d %H:%M:%f'
या जावा में 'yyyy-MM-dd HH:mm:ss.SSS'
) का उपयोग करने में बहुत आसान लगता है, बजाय सभी SQL बयानों के साथ SQLite फ़ंक्शन। पूर्व दृष्टिकोण को बनाए रखना बहुत आसान है।
TODO: एंड्रॉइड (API15 या बेहतर) के अंदर getDate / getTime / getTimestamp का उपयोग करते समय मैं परिणामों की जांच करूंगा ... शायद आंतरिक चालक sqlite-jdbc से अलग है ...