MySQL'de tarih bugüne eşit veya daha büyük


175

Aşağıdakileri yapmanın en iyi yolu nedir:

SELECT * FROM users WHERE created >= today;

Not: oluşturulan bir datetime alanıdır.

Yanıtlar:


329
SELECT * FROM users WHERE created >= CURDATE();

Ama bence demek istiyorsun created < today


11
CURDATE()sadece dönüş tarihi değil zaman
Shakti Singh

20
@ n00b Gelecekte oluşturulacak kullanıcılarınız nasıl ..? interesting =) Bir gönderinin süresinin dolup dolmadığını görmek için bunu kullanıyordum.
Garet Claborn

75
SELECT * FROM myTable WHERE  DATE(myDate) = DATE(NOW())

Daha fazla bilgi için: http://www.tomjepson.co.uk/tutorials/36/mysql-select-where-date-today.html


6
Belki bir şey eksik, ama DATETIME türleri ile CURDATE () çözümü çalışmıyor. Bu yapar.
Jahmic

artı DATE () işlevini DATE () işlevi aracılığıyla bugüne dönüştürme ve ardından where koşulu ile karşılaştırma yükü olduğundan bu çok zaman alır.
roopunk

Sütunlarda işlev kullanmayın, sorguyu dizini yoksayıp yavaş sorgulara neden olur. Alternatif yaklaşım için cevabımı kontrol et stackoverflow.com/a/42365426/4311336
Bsienn

33
SELECT * FROM users WHERE created >= NOW();

sütun datetime türündeyse.


1
bugün demek istiyorum şimdi: D bugün gibi 2011-03-03 değil 2011-03-03 14:02:02
n00b

@ n00b: Zaman dahilse endişelenmeyin, bugünden daha büyük satırlar döndürür
Shakti Singh

3
diyelim ki 2011-02-02 14:02:02 - 10:02:02 tarihinde oluşturulan kullanıcılar "bugün" oluşturulmuş olsalar bile sürümünüze döndürülmeyecek :)
n00b

@ n00b: Lol ya, zaman dursaydı hiçbir kullanıcı iade edilmezdi.
Mike Purcell

15

'Oluşturulan' datetime türündeyse

SELECT * FROM users WHERE created < DATE_ADD(CURDATE(), INTERVAL 1 DAY);

CURDATE () ayrıca '2013-05-09 00:00:00' anlamına gelir


Bunun için teşekkürler. Aslında (aynı şekilde kullanılır) DATE_SUB gerekiyordu, ama bu beni doğru yola koydu.
Daniel Price

Bu, tarihin 0 saniye içerdiği verileri döndürmez, yani '2013-05-09 00:00:00' kaçırılır
Bsienn

8

İşaretli cevap yanıltıcıdır. Belirtilen soru DateTime, ancak ihtiyaç duyulan şeyin adil olduğunu ifade etti CURDATE().

Bunun en kısa ve doğru cevabı :

SELECT * FROM users WHERE created >= CURRENT_TIMESTAMP;

5

Sütunda dizin varsa ve sütuna bir işlev uygulanırsa, dizin çalışmaz ve tam tablo taraması gerçekleşir ve bu da gerçekten yavaş sorgulamaya neden olur.

Dizin kullanmak ve datetime'ı bugün / şimdiki tarih ile karşılaştırmak için aşağıdakiler kullanılabilir.

OP için çözüm:

select * from users
where created > CONCAT(CURDATE(), ' 23:59:59')

Bugün için veri almak için örnek:

select * from users
where 
    created >= CONCAT(CURDATE(), ' 00:00:00') AND
    created <= CONCAT(CURDATE(), ' 23:59:59')

Veya kısaca BETWEEN kullanın

select * from users 
where created BETWEEN 
      CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59')

2
SELECT * FROM users WHERE created >= now()

Bu, bugünden bugüne kadar kayıtları geri döndürmeyecektir.
gsziszi

0

Aşağıdaki kod benim için çalıştı.

declare @Today date

Set @Today=getdate() --date will equal today    

Select *

FROM table_name
WHERE created <= @Today

-1
SELECT * FROM table_name WHERE CONCAT( SUBSTRING(json_date, 11, 4 ) ,  '-', SUBSTRING( json_date, 7, 2 ) ,  '-', SUBSTRING(json_date, 3, 2 ) ) >= NOW();

json_date ["05/11/2011"]


Bu çok ham bir çözüm
IgniteCoders

-5

tüm satırları döndürebilir ve bir if ifadesi içinde php tarihliiff işlevini kullanabilir, ancak bu sunucuya fazladan yük getirecektir.

if(dateDiff(date("Y/m/d"), $row['date']) <=0 ){    
}else{    
echo " info here";    
}

4
Bu veritabanı
seçimine göre
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.