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?


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

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

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

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';

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

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';

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.


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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.