MySQL Chọn Ngày tương đương với Hôm nay


96

Tôi đang cố chạy một câu lệnh mysql select trong đó nó xem ngày hôm nay và chỉ trả về kết quả đã đăng ký vào ngày hiện tại đó. Tôi hiện đã thử những cách sau, nhưng có vẻ như nó không hoạt động.

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE users.signup_date = CURDATE()

Tôi đã sửa đổi SELECTtuyên bố của mình cho điều này, cảm ơn các bạn.

SELECT id FROM users WHERE DATE(signup_date) = CURDATE()


có vẻ như signup_datelà datetime lĩnh vực
Sergii Stotskyi

@Serjio Có, nó hiện là trường datetime.
Jako

datatype của là gì signup_datenếu nó có chứa thời gian, sau đó bạn sẽ muốn sử dụng date_format trong WHEREkhoản để dải thời gian để phù hợp vớiCURDATE()
Taryn

@bluefeet cảm ơn, tôi đã sửa đổi tập lệnh của mình. Nó dường như hoạt động, nhưng khi không có kết quả. mysql_num_rowskhông hiển thị 0. Chỉ là một ô trống.
Jako

Câu trả lời:


197
SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE(signup_date) = CURDATE()

có cần thiết phải sử dụng DATE () ngay cả trường là loại Ngày không?
rashidnk

2
@rashidnk Không. Mặc dù anh ấy không nói rõ ràng trong câu hỏi, nhưng trường này có vẻ thuộc loại DATETIME.
Barmar

2
Mặc dù giải pháp này hoàn toàn chính xác, nhưng nó không mở rộng quy mô tốt (không thể sử dụng một chỉ mục trên signup_date, ngay cả khi một chỉ mục như vậy tồn tại). Thích giải pháp của Serjio .
RandomSeed

hoặc nếu để tìm vào một ngày cụ thể, với chỉ mục cũng đang được sử dụng `` SELECT users.id, DATE_FORMAT (users.signup_date, '% Y-% m-% d') TỪ người dùng mà signup_date> = '2017-08 -30 00:00:00 'và signup_date <=' 2017-08-30 23:59:59 '; `` `
Sumit M Asok

3
@SumitMAsok Tốt hơn để sử dụng < '2017-08-31 00:00:00'trong trường hợp bạn đang sử dụng phiên bản MySQL với mili giây.
Barmar

29

Truy vấn này sẽ sử dụng chỉ mục nếu bạn có nó cho signup_datetrường

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE signup_date >= CURDATE() && signup_date < (CURDATE() + INTERVAL 1 DAY)

Phản đối cho câu trả lời này là vô lý. Trên thực tế, đây là cách tiếp cận ưa thích, bởi vì truy vấn này có thể tận dụng một chỉ mục signup_date, không giống như các cách tiếp cận khác.
RandomSeed

2
@RandomSeed Ý tưởng chung về việc kiểm tra signup_dategiữa hai lần là đúng, nhưng lần thì không. Nó phải nằm giữa 00:0023:59:59vào ngày hiện tại.
Barmar

Chà, khoảng thời gian ngày cũng sai>. <Rốt cuộc, những phiếu phản đối không phải là vô lý.
RandomSeed

Truy vấn này hoạt động hiệu quả hơn (do chỉ mục). Máy WHERE DATE(signup_date) = CURDATE()chủ của tôi đã mất ~ 50 mili giây, máy chủ này ở đây 0,8 mili giây.
Kai Noack

13

Có vẻ như bạn cần thêm định dạng vào WHERE:

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE_FORMAT(users.signup_date, '%Y-%m-%d') = CURDATE()

Xem SQL Fiddle với Demo


1

Bạn có thể sử dụng CONCATvới CURDATE()toàn bộ thời gian trong ngày và sau đó lọc bằng công BETWEENtrong WHEREđiều kiện:

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE (users.signup_date BETWEEN CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59'))
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.