บทนำ: SQLite ใน Android
SQLite เป็นฐานข้อมูล SQL แบบโอเพนซอร์ส จัดเก็บข้อมูลในไฟล์ข้อความ รองรับในตัว ไม่ต้องเชื่อมต่อ JDBC/ODBC
ตัวอย่าง: ใช้ NOW กับ Timestamp และคิวรี่ข้อมูลวันนี้
ตัวอย่างนี้สาธิตการตั้งค่า Default Timestamp เป็น CURRENT_TIMESTAMP และคิวรี่ข้อมูลของวันปัจจุบัน
ขั้นตอนที่ 1-3: โปรเจกต์, Layout, MainActivity
โครงสร้างเหมือนตัวอย่างก่อนหน้า
ขั้นตอนที่ 4: DatabaseHelper.java - ใช้ NOW และคิวรี่วันนี้
@Override
public void onCreate(SQLiteDatabase db) {
try {
// datetime DEFAULT CURRENT_TIMESTAMP จะบันทึกเวลาปัจจุบัน (UTC) อัตโนมัติ
db.execSQL("CREATE TABLE " + CONTACTS_TABLE_NAME +
"(id INTEGER PRIMARY KEY, name TEXT, salary TEXT, datetime DEFAULT CURRENT_TIMESTAMP)");
} catch (SQLiteException e) {
try { throw new IOException(e); }
catch (IOException e1) { e1.printStackTrace(); }
}
}
public ArrayList<String> getAllContacts() {
SQLiteDatabase db = this.getReadableDatabase();
ArrayList<String> array_list = new ArrayList<>();
// DATE('now') = วันที่ปัจจุบัน (ไม่รวมเวลา)
// เงื่อนไข datetime >= DATE('now') = ตั้งแต่ต้นวันนี้ (00:00:00)
Cursor res = db.rawQuery(
"SELECT (id || ' : ' || name || ' : ' || salary || ' : ' || datetime) AS fullname " +
"FROM " + CONTACTS_TABLE_NAME +
" WHERE datetime >= DATE('now')",
null
);
res.moveToFirst();
while (!res.isAfterLast()) {
array_list.add(res.getString(res.getColumnIndex("fullname")));
res.moveToNext();
}
return array_list;
}
คำอธิบายสำคัญ
1. DEFAULT CURRENT_TIMESTAMP
- เมื่อ INSERT ไม่ระบุค่า datetime จะบันทึกเวลาปัจจุบัน (UTC) อัตโนมัติ
- รูปแบบ:
YYYY-MM-DD HH:MM:SS(ISO8601)
2. DATE('now')
- คืนค่าวันที่ปัจจุบันในรูปแบบ
YYYY-MM-DD(เวลาเป็น 00:00:00) - ใช้กรองข้อมูล "วันนี้" ได้โดย
datetime >= DATE('now')
3. ความแตกต่าง NOW vs CURRENT_TIMESTAMP
| คำสั่ง | คืนค่า | ใช้กับ |
|---|---|---|
| CURRENT_TIMESTAMP | YYYY-MM-DD HH:MM:SS (UTC) | DEFAULT value, INSERT |
| DATE('now') | YYYY-MM-DD (UTC) | WHERE clause, การเปรียบเทียบวันที่ |
| DATETIME('now') | YYYY-MM-DD HH:MM:SS (UTC) | WHERE clause, การเปรียบเทียบวันเวลา |
หมายเหตุเรื่อง Timezone
SQLite ใช้ UTC เป็นค่าเริ่มต้น หากต้องการเวลาท้องถิ่น (Local Time):
DATE('now', 'localtime')- วันที่ท้องถิ่นDATETIME('now', 'localtime')- วันเวลาท้องถิ่น
ผลลัพธ์
ListView แสดงเฉพาะรายการที่มีวันที่เป็นวันนี้ (ตาม UTC หรือ Local Time ตามคิวรี่)