Perbandingan SQLite DateTime

117

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

Brad
sumber
1
Format tanggal apa yang menyimpan nilai di mydatekolom Anda ? Saya menduga ini bukan salah satu format yang didukung SQLite: sqlite.org/lang_datefunc.html
OMG Ponies
1
OMG, ini adalah tipe data waktu
Brad
4
Penggunaan datetime () itu akan menghasilkan nilai tepat yang Anda berikan, tidak ada alasan untuk menggunakannya di sini: cukup gunakan string saja. Dan jika Anda hanya berurusan dengan tanggal, Anda harus menghapus bagian waktu nol --- pada dasarnya pastikan kedua sisi dalam format yang sama. (Jika tidak '2009-11-13', untuk tanggal saya, akan kurang dari '2009-11-13 00:00:00'.)
1
Agar Visual Studio dengan SQLite berfungsi bagi saya untuk menjalankan kueri tanggal / waktu, saya perlu menggunakan Datetime()seperti @Brad yang telah disertakan dalam penyebutan solusinya. Jika VS2012 mengeluh. Terima kasih Brad.
CaptainBli
terima kasih telah memperbarui solusi Anda. Betapa anehnya bahwa format default untuk tanggal dalam .NET akan menghasilkan kebalikan dari "<" vs ">".
Dave Friedel

Jawaban:

57

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
10
Untuk semua yang membaca kalimat pertama, di '17 SQLite memang memiliki datedandatetime
alisianoi
3
Kemarin membaca tentang jenis afinitas di sini: sqlite.org/datatype3.html Pada dasarnya, jika Anda memerlukan tanggal, Anda mendeklarasikan a date(atau datetime) pada kolom yang secara internal diperlakukan sebagai text. Itu sesuai dengan kebutuhan saya.
alisianoi
100

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.

Mark Smith
sumber
2
Asalkan formatnya distandarisasi, bagaimana perbedaan YYYY-MM-DD dengan tanpa tanda hubung? Bukankah perbandingan akan berakhir sama?
Damon
2
@ Damon: saya pikir dia menggunakan int untuk datatype
thumbmunkeys
1
Tidak, ini adalah string - Anda dapat melihatnya di tanda kutip - Tapi ini adalah ide bagus: Dengan pesanan ini YY MM DD dimungkinkan untuk membandingkan tanggal. @ Damon itu juga harus bekerja dengan tanda hubung!
Sedat Kilinc
1
Saya ingin tahu apakah saya dapat melakukan hal yang sama jika saya menggunakan format yyyyMMddHHmmss untuk menyimpan, sehingga saya dapat menyertakan bagian waktu juga. Apakah itu akan menyebabkan luapan atau sesuatu?
faizal
2
Saya menggunakan: yyyyMMddHHmm tanpa masalah, saya berharap yyyyMMddHHmmss bekerja sama
Steve Byrne
39

Saya mengalami masalah yang sama baru-baru ini, dan saya menyelesaikannya seperti ini:

SELECT * FROM table WHERE 
    strftime('%s', date) BETWEEN strftime('%s', start_date) AND strftime('%s', end_date)
Simon
sumber
% s harus diapit di antara karakter tanda kutip tunggal, yaitu: strftime ('% s', date)
mvladic
Berhasil. Solusi yang dimodifikasi untuk memilih semua baris setelah tanggal tertentu: SELECT * FROM table WHERE strftime ('% s', added)> strftime ('% s', "2017-01-01 00:00:00")
Progammer Baru
Saya mengevaluasi menggunakan strftimeklausa WHERE seperti dalam contoh ini, dan saya memiliki pertanyaan: Apakah efisien menggunakan strftimeseperti ini? Apakah dievaluasi sekali untuk setiap baris atau satu kali per kueri?
Alvaro Gutierrez Perez
ini harus diterima sebagai jawaban yang benar!
Luka Sh
20

Berikut ini berfungsi dengan baik untuk saya menggunakan SQLite:

SELECT * 
    FROM ingresosgastos 
    WHERE fecharegistro BETWEEN "2010-01-01" AND "2013-01-01"
ifredy
sumber
Ini berfungsi untuk saya di iOS, Objective-C Query saya adalah sebagai berikut: PILIH JUMLAH (carSold) FROM cars_sales_tbl WHERE date BETWEEN '2015-04-01' AND '2015-04-30' AND carType = "Hybrid"
Randika Vishman
9

Sqlite tidak dapat dibandingkan pada tanggal. kita perlu mengubahnya menjadi detik dan memasukkannya sebagai integer.

Contoh

SELECT * FROM Table  
WHERE  
CAST(strftime('%s', date_field)  AS  integer) <=CAST(strftime('%s', '2015-01-01')  AS  integer) ;
Hardeep Singh
sumber
8

Mengikuti berhasil untuk saya.

SELECT *
FROM table_log
WHERE DATE(start_time) <= '2017-01-09' AND DATE(start_time) >= '2016-12-21'
Jose Jithin Stanly
sumber
Anda bisa menggunakan di antaranya.
Tamim Attafi
6

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.

WHERE dateTimeRecorded between date('now', 'start of day','-2 days') 
                           and date('now', 'start of day', '+1 day') 

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,

select * 
  from table_1 
  where mydate between Datetime('2009-11-13 00:00:00') 
                   and Datetime('2009-11-15 23:59:59')

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 :)

Lyall Pearce
sumber
2

Saya harus menyimpan waktu dengan informasi zona waktu di dalamnya, dan dapat memperoleh kueri yang bekerja dengan format berikut:

"SELECT * FROM events WHERE datetime(date_added) BETWEEN 
      datetime('2015-03-06 20:11:00 -04:00') AND datetime('2015-03-06 20:13:00 -04:00')"

Waktu disimpan dalam database sebagai TEXT biasa dalam format berikut:

2015-03-06 20:12:15 -04:00
Abadi 21
sumber
2

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

  1. 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.

    select * from myTable where myColumn BETWEEN strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day') AND strftime('%m/%d/%Y %H:%M',datetime('now','localtime')); 
  2. Kueri di bawah ini akan menggunakan lebih besar dari operator (>).

      select * from myTable where myColumn > strftime('%m/%d/%Y %H:%M', datetime('now','localtime'), '-5 day');  

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

Menyimpulkan Jain
sumber
1

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.

J. Polfer
sumber
0

Pertanyaan saya, saya lakukan sebagai berikut:

SELECT COUNT(carSold) 
FROM cars_sales_tbl
WHERE date
BETWEEN '2015-04-01' AND '2015-04-30'
AND carType = "Hybrid"

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!

Randika Vishman
sumber
0

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.

SELECT * FROM tables WHERE datetime 
BETWEEN '2018-10-01 00:00:00' AND '2018-10-10 23:59:59';

Saya tidak bersih untuk menggunakan fungsi datetime (). Mungkin mereka telah memperbarui kueri SQL pada versi SQLite tersebut.

Aruman
sumber