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
ทำงานได้ดี
ในที่สุดเมื่อจัดการกับการทำงานจริงภายในโปรแกรม (โดยไม่ต้องใช้ sqlite executable ... )
BTW: ฉันใช้ JDBC (ไม่แน่ใจเกี่ยวกับภาษาอื่น ๆ ) ... ไดรเวอร์ sqlite-jdbc v3.7.2 จากxerial - อาจมีการแก้ไขที่ใหม่กว่าเปลี่ยนพฤติกรรมที่อธิบายไว้ด้านล่าง ... หากคุณกำลังพัฒนาใน 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)
ดังนั้นคำถามคือเราจะเลือกแทรกหรืออัพเดทวัตถุ Date / Time / Timestamp ได้อย่างไร? ไม่มีคำตอบง่าย ๆ คุณสามารถลองใช้ชุดค่าผสมต่างกัน แต่จะบังคับให้คุณฝังฟังก์ชัน SQLite ในคำสั่ง SQL ทั้งหมด มันง่ายกว่าที่จะกำหนดคลาสยูทิลิตี้เพื่อแปลงข้อความเป็นวัตถุวันที่ภายในโปรแกรม Java ของคุณ แต่โปรดจำไว้เสมอว่า SQLite แปลงค่าวันที่เป็น UTC + 0000
โดยสรุปแม้ว่ากฎทั่วไปจะใช้ชนิดข้อมูลที่ถูกต้องเสมอหรือแม้กระทั่งจำนวนเต็มที่แสดงถึงเวลา Unix (มิลลิวินาทีนับตั้งแต่ยุค) ฉันพบว่าการใช้รูปแบบ SQLite เริ่มต้นง่ายขึ้น ( '%Y-%m-%d %H:%M:%f'
หรือใน Java 'yyyy-MM-dd HH:mm:ss.SSS'
) ค่อนข้างซับซ้อน ฟังก์ชัน SQLite วิธีการแบบเดิมนั้นง่ายกว่ามากในการรักษา
สิ่งที่ต้องทำ: ฉันจะตรวจสอบผลลัพธ์เมื่อใช้ getDate / getTime / getTimestamp ใน Android (API15 หรือดีกว่า) ... บางทีไดรเวอร์ภายในอาจแตกต่างจาก sqlite-jdbc ...