Saya sepertinya tidak bisa mendapatkan hasil yang dapat diandalkan dari kueri terhadap database sqlite menggunakan string datetime sebagai perbandingan:
select *
from table_1
where mydate >= '1/1/2009' and mydate <= '5/5/2009'
bagaimana cara menangani perbandingan datetime dengan sqlite?
update: field mydate adalah tipe data DateTime
mydate
kolom Anda ? Saya menduga ini bukan salah satu format yang didukung SQLite: sqlite.org/lang_datefunc.html'2009-11-13'
, untuk tanggal saya, akan kurang dari'2009-11-13 00:00:00'
.)Datetime()
seperti @Brad yang telah disertakan dalam penyebutan solusinya. Jika VS2012 mengeluh. Terima kasih Brad.Jawaban:
SQLite tidak memiliki tipe datetime khusus , tetapi memiliki beberapa fungsi datetime . Ikuti format representasi string (sebenarnya hanya format 1-10) yang dipahami oleh fungsi-fungsi tersebut (menyimpan nilai sebagai string) lalu Anda dapat menggunakannya, ditambah perbandingan leksikografis pada string akan cocok dengan perbandingan waktu (selama Anda tidak coba bandingkan tanggal dengan waktu atau waktu dengan waktu, yang toh tidak masuk akal).
Bergantung pada bahasa yang Anda gunakan, Anda bahkan bisa mendapatkan konversi otomatis . (Yang tidak berlaku untuk perbandingan dalam pernyataan SQL seperti contoh, tetapi akan membuat hidup Anda lebih mudah.)
sumber
date
dandatetime
date
(ataudatetime
) pada kolom yang secara internal diperlakukan sebagaitext
. Itu sesuai dengan kebutuhan saya.Untuk mengatasi masalah ini, saya menyimpan tanggal sebagai
YYYYMMDD
. Jadi,where mydate >= '20090101' and mydate <= '20050505'
Itu hanya BEKERJA biasa sepanjang waktu. Anda mungkin hanya perlu menulis parser untuk menangani bagaimana pengguna memasukkan tanggal mereka sehingga Anda dapat mengonversinya menjadi
YYYYMMDD
.sumber
Saya mengalami masalah yang sama baru-baru ini, dan saya menyelesaikannya seperti ini:
sumber
strftime
klausa WHERE seperti dalam contoh ini, dan saya memiliki pertanyaan: Apakah efisien menggunakanstrftime
seperti ini? Apakah dievaluasi sekali untuk setiap baris atau satu kali per kueri?Berikut ini berfungsi dengan baik untuk saya menggunakan SQLite:
sumber
Sqlite tidak dapat dibandingkan pada tanggal. kita perlu mengubahnya menjadi detik dan memasukkannya sebagai integer.
Contoh
sumber
Mengikuti berhasil untuk saya.
sumber
Saya memiliki situasi di mana saya menginginkan data dari hingga dua hari yang lalu dan hingga akhir hari ini. Saya sampai pada yang berikut ini.
Ok teknisnya besok malam juga saya pulangkan seperti poster aslinya, kalau ada datanya, tapi data saya semua historis.
Hal utama yang perlu diingat, poster awal mengecualikan semua data setelah 2009-11-15 00:00:00. Jadi, setiap data yang dicatat pada tengah malam pada tanggal 15 dimasukkan tetapi data apa pun setelah tengah malam pada tanggal 15 tidak dimasukkan . Jika pertanyaan mereka adalah,
Penggunaan klausa antara untuk kejelasan.
Akan lebih baik. Ini masih belum memperhitungkan detik kabisat di mana satu jam sebenarnya bisa memiliki lebih dari 60 detik, tetapi cukup baik untuk diskusi di sini :)
sumber
Saya harus menyimpan waktu dengan informasi zona waktu di dalamnya, dan dapat memperoleh kueri yang bekerja dengan format berikut:
Waktu disimpan dalam database sebagai TEXT biasa dalam format berikut:
sumber
Di bawah ini adalah metode untuk membandingkan tanggal tetapi sebelum itu kita perlu mengidentifikasi format tanggal yang disimpan di DB
Saya memiliki tanggal yang disimpan dalam format MM / DD / YYYY HH: MM sehingga harus dibandingkan dalam format tersebut
Kueri di bawah ini membandingkan tanggal konversi menjadi format MM / DD / YYY dan mendapatkan data dari lima hari terakhir hingga hari ini. BETWEEN operator akan membantu dan Anda cukup menentukan tanggal mulai DAN tanggal akhir.
Kueri di bawah ini akan menggunakan lebih besar dari operator (>).
Semua perhitungan yang telah saya lakukan menggunakan waktu saat ini, Anda dapat mengubah format dan tanggal sesuai kebutuhan Anda.
Semoga ini bisa membantu Anda
Disimpulkan
sumber
Anda juga dapat menulis fungsi pengguna Anda sendiri untuk menangani tanggal dalam format yang Anda pilih. SQLite memiliki metode yang cukup sederhana untuk menulis fungsi pengguna Anda sendiri. Misalnya, saya menulis beberapa untuk menambah durasi waktu bersama.
sumber
Pertanyaan saya, saya lakukan sebagai berikut:
Saya mendapat petunjuk dari jawaban @ ifredy. Yang saya lakukan hanyalah, saya ingin kueri ini dijalankan di iOS, menggunakan Objective-C. Dan itu berhasil!
Semoga seseorang yang melakukan Pengembangan iOS, akan memanfaatkan jawaban ini juga!
sumber
Saat ini saya sedang mengembangkan menggunakan paket System.Data.SQlite NuGet (versi 1.0.109.2). Yang menggunakan SQLite versi 3.24.0.
Dan ini berhasil untuk saya.
Saya tidak bersih untuk menggunakan fungsi datetime (). Mungkin mereka telah memperbarui kueri SQL pada versi SQLite tersebut.
sumber