Bagaimana cara saya menanyakan dua tanggal menggunakan MySQL?

225

Pertanyaan berikut:

SELECT * FROM `objects` 
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')

tidak mengembalikan apa pun.

Saya harus memiliki lebih dari cukup data untuk agar kueri berfungsi. Apa yang saya lakukan salah?

NullVoxPopuli
sumber
32
Berhati-hatilah dengan ANTARA, karena nilai mindan keduanya maxdianggap berada dalam kisaran, untuk tidak memproses dua kali tanggal yang merupakan nilai mindan max(kasus tepi). Misalnya, tanggalnya 2010-09-29 00:00:00akan antara 2010-09-28 00:00:00dan2010-09-29 00:00:00 , DAN JUGA antara 2010-09-29 00:00:00dan2010-09-30 00:00:00
minipif
ya, apa yang dia katakan ^^
Albert Rannetsperger

Jawaban:

472

Tanggal kedua Anda sebelum tanggal pertama Anda (mis. Anda menanyakan antara 29 September 2010 dan 30 Januari 2010). Coba balikkan urutan tanggal:

SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
Daniel Vandersluis
sumber
Saya memang tahu ini tetapi sekarang memiliki masalah dengan UPDATE. Saya mencoba menggunakan ANTARA untuk UPDATE, apakah harus bekerja dengan cara yang sama?
Ingus
3
@IngusGraholskis: whereklausa harus bekerja pada selectatau updatepernyataan yang sama.
T30
Secara pribadi, saya menemukan istilah 'dari' dan 'ke' cara licik untuk mengingat urutan di mana kueri harus ditulis.
KeaganFouche
Bagaimana cara mengembalikan semua data jika kedua tanggal adalah nol atau kosong?
Pengkodean dunia
23

Kueri Anda harus memiliki tanggal sebagai

select * from table between `lowerdate` and `upperdate`

mencoba

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
Nik
sumber
20

Apakah date_fieldtipe datetime? Anda juga harus menempatkan tanggal eariler terlebih dahulu.

Harus:

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
Roket Hazmat
sumber
17

DATE () adalah fungsi MySQL yang mengekstrak hanya bagian tanggal dari tanggal atau ekspresi tanggal / waktu

SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';
sabin
sumber
Anda bisa menambahkan penjelasan sehingga orang akan mengerti apa yang Anda lakukan.
Franz Gleichmann
7

Sebagai ekstensi untuk jawaban dari @sabin dan sebuah petunjuk jika seseorang ingin membandingkan bagian tanggal saja (tanpa waktu):

Jika bidang untuk dibandingkan adalah dari tipe datetime dan hanya tanggal yang ditentukan untuk perbandingan, maka tanggal ini secara internal dikonversi ke nilai datetime . Ini berarti permintaan berikut

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30' AND '2010-09-29')

akan dikonversi menjadi

SELECT * FROM `objects` WHERE (date_time_field BETWEEN '2010-01-30 00:00:00' AND '2010-09-29 00:00:00')

secara internal.

Ini pada gilirannya mengarah ke hasil yang tidak termasuk objek dari 2010-09-29 dengan nilai waktu lebih besar dari 00:00:00!

Dengan demikian, jika semua objek dengan tanggal 2010-09-29 harus disertakan juga, bidang untuk membandingkan harus dikonversi ke tanggal:

SELECT * FROM `objects` WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')
ltlBeBoy
sumber
4

Anda dapat melakukannya secara manual, dengan membandingkan dengan lebih dari atau sama dan kurang dari atau sama.

 select * from table_name where created_at_column  >=   lower_date  and  created_at_column <= upper_date;

Dalam contoh kita, kita perlu mengambil data dari hari tertentu ke hari. Kami akan membandingkan dari awal hari ke detik terakhir di hari lain.

  select * from table_name where created_at_column  >=   '2018-09-01 00:00:00'  and  created_at_column <= '2018-09-05 23:59:59';
Fahd Allebdi
sumber
1

Mungkin ada masalah dengan konfigurasi tanggal di sisi server atau di sisi klien. Saya menemukan ini menjadi masalah umum pada banyak basis data ketika tuan rumah dikonfigurasikan dalam bahasa Spanyol, Perancis atau apa pun ... yang dapat memengaruhi format dd / mm / yyyy atau mm / dd / yyyy.

SoulWanderer
sumber
3
Masalahnya adalah tanggal yang lebih lama terdaftar sebelum tanggal yang lebih baru.
theninjagreg
1

Hanya Cast date_field sebagai tanggal

SELECT * FROM `objects` 
WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND 
'2010-01-30' )
DS Mercy
sumber
1

Saat menggunakan nilai Tanggal dan Waktu, Anda harus memberikan kolom sebagai DateTimedan bukan Date. Coba:

SELECT * FROM `objects` 
WHERE (CAST(date_field AS DATETIME) 
BETWEEN CAST('2010-09-29 10:15:55' AS DATETIME) AND CAST('2010-01-30 14:15:55' AS DATETIME))
Bruno Barral
sumber
0

Coba alihkan tanggalnya:

2010-09-29 > 2010-01-30?
Jure1873
sumber