Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีใช้ NOW ใน Timestamp ของ Android SQLite

บทนำ: 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_TIMESTAMPYYYY-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 ตามคิวรี่)