2012-10-01 66 views
49

Tôi đang cố gắng chạy câu lệnh chọn mysql, nơi nó nhìn vào ngày hôm nay và chỉ trả lại kết quả đã đăng ký vào ngày hiện tại đó. Tôi hiện đang thử những điều sau đây, nhưng nó dường như không hoạt động.MySQL Chọn Ngày Bằng Hôm nay

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

Tôi đã sửa đổi tuyên bố SELECT 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()

+0

có vẻ như 'signup_date' là trường datetime – Serjio

+0

@Serjio Vâng, hiện tại nó là trường ngày giờ. – Jako

+0

datatype của 'signup_date' là gì nếu nó chứa thời gian, sau đó bạn sẽ muốn sử dụng date_format trong mệnh đề' WHERE' để loại bỏ thời gian khớp với 'CURDATE()' – Taryn

Trả lời

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

là cần thiết để sử dụng DATE() ngay cả trường là loại ngày? – rashidnk

+1

@rashidnk No. Mặc dù anh ta không nói rõ ràng trong câu hỏi, trường này rõ ràng là kiểu 'DATETIME'. – Barmar

+1

Trong khi giải pháp này là hoàn toàn chính xác, nó không quy mô tốt (không thể sử dụng một chỉ mục trên 'signup_date', ngay cả khi chỉ mục đó tồn tại). Ưu tiên [giải pháp của Serjio] (http://stackoverflow.com/a/12677822/1446005). – RandomSeed

9

Âm thanh như bạn cần phải thêm định dạng cho 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 with Demo

+5

nói lời tạm biệt với hiệu suất của bạn. Truy vấn này không bao giờ sử dụng chỉ mục – Serjio

12

Truy vấn này sẽ sử dụng chỉ mục nếu bạn có nó cho signup_date lĩnh vực

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

Những điều ngược lại cho câu trả lời này là vô lý. Đây thực ra là cách tiếp cận được ưa thích, bởi vì truy vấn này sẽ có thể tận dụng một chỉ mục trên 'signup_date', không giống như các cách tiếp cận khác. – RandomSeed

+0

@RandomSeed Ý tưởng chung của thử nghiệm cho 'signup_date' giữa hai lần là chính xác, nhưng thời gian thì không. Nó phải nằm trong khoảng từ '00: 00' đến '23: 59: 59' vào ngày hiện tại. – Barmar

+1

@Barmar Có bạn đã đúng. Tôi đã sửa câu trả lời. – RandomSeed

Các vấn đề liên quan