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.