Saya membuat aplikasi Android dan perlu menyimpan tanggal / waktu catatan pembuatan. Dokumen SQLite mengatakan, bagaimanapun, "SQLite tidak memiliki kelas penyimpanan yang disisihkan untuk menyimpan tanggal dan / atau waktu" dan "mampu menyimpan tanggal dan waktu sebagai nilai TEXT, REAL, atau INTEGER".
Apakah ada alasan teknis untuk menggunakan satu jenis di atas jenis lainnya? Dan dapatkah satu kolom menyimpan tanggal dalam salah satu dari tiga format dari baris ke baris?
Saya perlu membandingkan tanggal nanti. Misalnya, di aplikasi saya, saya akan menampilkan semua rekaman yang dibuat antara tanggal A hingga tanggal B. Saya khawatir bahwa tidak memiliki kolom DATETIME yang benar dapat mempersulit perbandingan.
Jawaban:
SQlite tidak memiliki tipe datetime tertentu. Anda dapat menggunakan
TEXT
,REAL
atauINTEGER
mengetik, mana saja yang sesuai dengan kebutuhan Anda.Langsung dari DOCS
Fungsi Tanggal dan Waktu bawaan SQLite dapat ditemukan di sini .
sumber
Karena itu, saya akan menggunakan INTEGER dan menyimpan detik sejak Unix epoch (1970-01-01 00:00:00 UTC).
sumber
RSQLite
tampaknya beralihPOSIXct
ke zaman numerik, jadi ini berfungsi cukup baik untuk saya.Salah satu fitur canggih dari SQLite adalah memungkinkan Anda memilih jenis penyimpanan. Keuntungan / kerugian masing-masing dari tiga kemungkinan yang berbeda:
String ISO8601
Bilangan riil
Bilangan bulat
Jika Anda perlu membandingkan berbagai jenis atau mengekspor ke aplikasi eksternal, Anda bebas menggunakan fungsi konversi datetime SQLite sesuai kebutuhan.
sumber
localtime_r()
( sqlite.org/lang_datefunc.html#caveats_and_bugs ) dalam implementasi referensi, danlocaltime()
berpotensi rentan terhadap 2038 jika platform host memiliki 32-bittime_t
. Yang mengatakan, karena SQLite mengklaim untuk menjaga kemungkinan ini dengan memetakan tanggal di luar ke dalam rentang pra-konversi yang aman (lihat tautan yang sama), saya pikir itu tidak mungkin menjadi masalah kecuali mungkin dalam kasus esoterik.Untuk hampir semua masalah tanggal dan waktu, saya lebih suka menyederhanakan banyak hal, sangat, sangat sederhana ... Hingga detik disimpan dalam bilangan bulat.
Bilangan bulat akan selalu didukung sebagai bilangan bulat dalam database, file datar, dll. Anda melakukan sedikit matematika dan memasukkannya ke jenis lain dan Anda dapat memformat tanggal sesuai keinginan Anda.
Dengan cara ini, Anda tidak perlu khawatir ketika [masukkan database favorit saat ini di sini] diganti dengan [database favorit masa depan] yang kebetulan tidak menggunakan format tanggal yang Anda pilih hari ini.
Ini hanya sedikit overhead matematika (mis. Metode - membutuhkan dua detik, saya akan memposting intinya jika perlu) dan menyederhanakan banyak hal untuk banyak operasi terkait tanggal / waktu nanti.
sumber
Simpan di bidang tipe
long
. LihatDate.getTime()
dannew Date(long)
sumber