MySQL kullanarak iki tarih arasında nasıl sorgulama yaparım?


225

Aşağıdaki sorgu:

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

hiçbir şey döndürmez.

Sorgu olsa çalışması için yeterli veri olması gerekir. Neyi yanlış yapıyorum?


32
Her ikisi de, ARASINDA dikkatli olun minve maxdeğerler aralığı içinde olduğu kabul edilir ya da iki kere bir tarih işlemez için, minve maxdeğeri (kenarı durumda). Örneğin, tarih 2010-09-29 00:00:00olacak arasındaki 2010-09-28 00:00:00ve2010-09-29 00:00:00 , VE AYRICA arasında 2010-09-29 00:00:00ve2010-09-30 00:00:00
minipif

evet, ne dedi ^^
Albert Rannetsperger

Yanıtlar:


472

İkinci tarihiniz ilk tarihinizden önce (yani, 29 Eylül 2010 ile 30 Ocak 2010 arasında sorgulama yapıyorsunuz). Tarihlerin sırasını tersine çevirmeyi deneyin:

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

Bunu biliyordum ama şimdi UPDATE ile ilgili bir sorun var. Aynı şekilde çalışması gerekir UPDATE için ARASINDA kullanmaya çalışıyorum?
Ingus

3
@IngusGraholskis: bir wherecümle selectveya updateifadelerde aynı şekilde çalışmalıdır .
T30

Şahsen, sorgunun yazılması gereken sırayı hatırlamak için 'from' ve 'to' terimlerini gizli bir şekilde buluyorum.
KeaganFouche

Her iki tarih de boş veya boşsa tüm veriler nasıl döndürülür?
Kodlama dünyası

23

Sorgunuzun tarihi

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

Deneyin

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

20

date_fieldÇeşidi datetime? Ayrıca ilk önce kazanıcı tarihini koymanız gerekir.

Olmalı:

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

17

DATE (), bir tarihin veya tarih / saat ifadesinin yalnızca tarih bölümünü ayıklayan bir MySQL işlevidir

SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';

Eğer olabilir insanlar ne yaptığınızı anlayacaksınız böylece bir açıklama ekleyin.
Franz Gleichmann

7

@Sabin'den gelen cevaba ek olarak ve sadece tarih bölümünü karşılaştırmak istiyorsa bir ipucu olarak (zaman olmadan):

Karşılaştırılacak alan datetime türündeyse ve karşılaştırma için yalnızca tarihler belirtilmişse, bu tarihler dahili olarak datetime değerlerine dönüştürülür . Bu şu sorgu anlamına gelir

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

dönüştürülecek

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

içten.

Bu da, 2010-09-29 arasındaki zaman değeri 00:00:00'dan büyük olan nesneleri içermeyen bir sonuca yol açar!

Bu nedenle, 2010-09-29 tarihine sahip tüm nesnelerin de dahil edilmesi gerekiyorsa, karşılaştırılacak alanın bir tarihe dönüştürülmesi gerekir:

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

4

Daha büyük veya eşit ve daha küçük veya eşit ile karşılaştırarak manuel olarak yapabilirsiniz.

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

Örneğimizde, belirli bir günden güne veri almamız gerekiyor. Günün başından başka bir günün en son saniyesine kadar karşılaştırırız.

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

2

Tarih ve Saat değerlerini kullanırken , alanları DateTimedeğil olarak atamanız gerekir Date. Deneyin :

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

1

Sunucu tarafında veya istemci tarafında tarih yapılandırmasıyla ilgili bir sorun olabilir. Ana bilgisayar İspanyolca, Fransızca veya herhangi bir şekilde yapılandırıldığında birden çok veritabanında ortak bir sorun olarak buldum ... biçimini etkileyebilir dd / mm / yyyy veya mm / dd / yyyy.


3
Sorun eski tarihin yeni tarihten önce listelenmesiydi.
theninjagreg

1

Date_field'ı tarih olarak yayınla

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

0

Tarihleri ​​değiştirmeyi deneyin:

2010-09-29 > 2010-01-30?
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.