Ngày tháng bằng hoặc lớn hơn ngày hôm nay trong MySQL


175

Cách tốt nhất để làm như sau:

SELECT * FROM users WHERE created >= today;

Lưu ý: được tạo là trường datetime.

Câu trả lời:


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

Nhưng tôi nghĩ bạn có nghĩa là created < today


11
CURDATE()chỉ trả lại ngày không phải thời gian
Shakti Singh

20
@ n00b làm thế nào để bạn có người dùng được tạo trong tương lai ..? thú vị =) Tôi đã sử dụng điều này để xem nếu một bài viết đã hết hạn.
Garet Claborn

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

Đọc thêm: http://www.tomjepson.co.uk/tutorials/36/mysql-select-where-date-today.html


6
Có thể tôi đang thiếu một cái gì đó, nhưng với các loại DATETIME, giải pháp CURDATE () không hoạt động. Điều này không.
Jahmic

cộng với việc này mất rất nhiều thời gian vì có quá trình chuyển đổi DATETIME thành ngày qua hàm DATE () và sau đó so sánh với điều kiện where.
roopunk

Không sử dụng các hàm trên các cột, nó làm cho truy vấn bỏ qua chỉ mục, gây ra các truy vấn chậm. Kiểm tra câu trả lời của tôi để biết cách tiếp cận thay thế stackoverflow.com/a/42365426/4311336
Bsienn

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

nếu cột là kiểu datetime.


1
ý tôi là hôm nay không phải bây giờ: D tôi cần ngày hôm nay như 2011/03/03 chứ không phải 2011/03/03 14:02:02
n00b

@ n00b: nó sẽ trả về các hàng lớn hơn ngày hôm nay, đừng lo lắng nếu thời gian được bao gồm
Shakti Singh

3
giả sử đó là 2011/02/02 14:02:02 - người dùng đã được tạo vào lúc 10:02:02 sẽ không được trả lại trong phiên bản của bạn mặc dù họ đã được tạo "hôm nay" :)
n00b ngày

@ n00b: Lol ya, sẽ không có người dùng nào được trả lại, nếu chúng ta có thể dừng thời gian.
Mike Purcell

15

Nếu 'created' là kiểu datetime

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

HIỆN TẠI () cũng có nghĩa là '2013-05-09 00:00:00'


Cảm ơn vì điều đó. Tôi thực sự cần DATE_SUB (được sử dụng theo cùng một cách), nhưng điều này đưa tôi đi đúng hướng.
Daniel Giá

Điều này sẽ không trả về dữ liệu trong đó ngày chứa 0 giây, tức là '2013-05-09 00:00:00' sẽ bị bỏ lỡ
Bsienn

8

Câu trả lời được đánh dấu là sai lệch. Câu hỏi được nêu là DateTime, nhưng đã nêu những gì cần thiết chỉ là CURDATE().

Các câu trả lời ngắn nhất và chính xác cho điều này là:

SELECT * FROM users WHERE created >= CURRENT_TIMESTAMP;

5

Nếu cột có chỉ mục và một chức năng được áp dụng trên cột thì chỉ mục không hoạt động và quét toàn bộ bảng xảy ra, gây ra truy vấn thực sự chậm.

Để sử dụng chỉ mục và so sánh datetime với ngày hôm nay / ngày hiện tại, có thể sử dụng các mục sau đây.

Giải pháp cho OP:

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

Mẫu để lấy dữ liệu cho ngày hôm nay:

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

Hoặc sử dụng ngắn gọn GIỮA

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

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

Điều này sẽ không trả lại hồ sơ trước thời điểm này kể từ hôm nay.
gsziszi

0

Các mã dưới đây làm việc cho tôi.

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"]


Đây là một giải pháp rất thô sơ
IgniteCoders

-5

bạn có thể trả về tất cả các hàng và sử dụng hàm php dateiff bên trong một câu lệnh if, mặc dù điều đó sẽ tăng thêm tải cho máy chủ.

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

4
điều này rất chậm so với cơ sở dữ liệu chọn
IgniteCoders
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.