এসকিউএলাইট তারিখগুলি সঞ্চয় করতে পাঠ্য, বাস্তব, বা পূর্ণসংখ্যার ডেটা প্রকার ব্যবহার করতে পারে। আরও বেশি, আপনি যখনই কোনও অনুসন্ধান করেন, ফলাফলগুলি বিন্যাস ব্যবহার করে দেখানো হয় %Y-%m-%d %H:%M:%S
।
এখন, আপনি যদি এসকিউএল তারিখ / সময় ফাংশন ব্যবহার করে তারিখ / সময়ের মান সন্নিবেশ করান / আপডেট করেন তবে আপনি বাস্তবে মিলিসেকেন্ডগুলিও সঞ্চয় করতে পারেন। যদি এটি হয় তবে ফলাফলগুলি ফর্ম্যাট ব্যবহার করে দেখানো হবে %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
ঠিক কাজ করে।
শেষ পর্যন্ত, যখন কোনও প্রোগ্রামের মধ্যে প্রকৃত ক্রিয়াকলাপগুলি নিয়ে কাজ করা হয় (স্ক্লাইট ব্যবহার না করে এক্সিকিউটেবল ...)
বিটিডাব্লু: আমি জেডিবিসি ব্যবহার করছি (অন্যান্য ভাষা সম্পর্কে নিশ্চিত নয়) ... স্কয়ারাইট-জেডিবিসি ড্রাইভার ভিরিয়াল থেকে v3.7.2 - সম্ভবত আরও নতুন সংশোধনগুলি নীচে বর্ণিত আচরণটি পরিবর্তন করবে ... আপনি যদি অ্যান্ড্রয়েডে বিকাশ করছেন তবে আপনি করবেন না একটি জেডিবিসি-ড্রাইভার দরকার। সমস্ত এসকিউএল অপারেশন ব্যবহার করে জমা দেওয়া যেতে পারে 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.
যেহেতু এসকিউএলাইটের একটি আসল তারিখ / সময় / টাইমস্ট্যাম্প ডেটা টাইপ নেই এই 3 টি পদ্ধতিতে মানগুলি এমনভাবে ফিরে আসে যেগুলি 0:
new java.sql.Date(0)
new java.sql.Time(0)
new java.sql.Timestamp(0)
সুতরাং, প্রশ্নটি হল: আমরা কীভাবে তারিখ / সময় / টাইমস্ট্যাম্প অবজেক্টগুলি নির্বাচন করতে, সন্নিবেশ করতে বা আপডেট করতে পারি? এর চেয়ে সহজ উত্তর নেই। আপনি বিভিন্ন সংমিশ্রণ চেষ্টা করতে পারেন তবে তারা আপনাকে সমস্ত এসকিউএল স্টেটমেন্টে এসকিউএলাইট ফাংশন এম্বেড করতে বাধ্য করবে। আপনার জাভা প্রোগ্রামের ভিতরে তারিখের অবজেক্টগুলিতে পাঠ্য রূপান্তরের জন্য কোনও ইউটিলিটি শ্রেণির সংজ্ঞা দেওয়া অনেক সহজ far তবে সর্বদা মনে রাখবেন যে এসকিউএলাইট যে কোনও তারিখের মান ইউটিসি +0000 এ রূপান্তর করে।
সংক্ষেপে, সর্বদা সঠিক ডেটা টাইপ ব্যবহার করার সাধারণ নিয়ম থাকা সত্ত্বেও, বা এমনকি ইউনিক্স সময়কে চিহ্নিত করার আগেও (পূর্ববর্তীকাল থেকে মিলি সেকেন্ড), তবুও আপনার সমস্ত এসকিউএল বিবৃতি জটিল করার জন্য আমি ডিফল্ট এসকিউএলাইট ফর্ম্যাটটি ( '%Y-%m-%d %H:%M:%f'
বা জাভাতে 'yyyy-MM-dd HH:mm:ss.SSS'
) ব্যবহার করে অনেক সহজ মনে করি find SQLite ফাংশন। পূর্বের পদ্ধতির বজায় রাখা অনেক সহজ।
টোডো: অ্যান্ড্রয়েডের মধ্যে getDate / getTime / getTimestamp ব্যবহার করার সময় আমি ফলাফলগুলি যাচাই করব (API15 বা আরও ভাল) ... সম্ভবত অভ্যন্তরীণ ড্রাইভার স্ক্লাইট-জেডিবিসি থেকে আলাদা ...