2012-10-30 35 views
6

Trong users bảng Tôi có một lĩnh vực được gọi dob mà các cửa hàng ngày tháng năm sinh của người sử dụng trong định dạng này:chọn người dùng * là ai một độ tuổi nhất định

1959-04-02 

Dù sao tôi muốn CHỌN tất cả người dùng 18 và 19 tuổi. Đây là truy vấn của tôi:

SELECT * 
FROM `users` 
WHERE dob BETWEEN '1993-10-30' AND '1994-10-30' 

Nhưng dường như chỉ chọn chủ yếu là 18 tuổi và một số (nhưng không phải tất cả) 19 tuổi. Tôi có một nhóm người dùng thử nghiệm trong db và số lượng 18 và 19 tuổi là bằng nhau. Tuy nhiên, truy vấn này mang lại khoảng 90% 18 tuổi và khoảng 10% 19 tuổi. Tại sao?

+0

lĩnh vực của bạn là một ngày thực địa ngay ? không phải là một chuỗi? –

+0

@FrankThomas yea đó là ngày. – TK123

+1

làm như sau: SELECT * FROM 'users' WHERE dob> = '1993-10-30' AND dob <= '1994-10-30' – kidz

Trả lời

4

Những người từ 18 đến 19 tuổi bao gồm một loạt các ngày sinh hơn 2 năm. Truy vấn của bạn chỉ bao gồm 1 năm. Xem xét làm lại logic của bạn.

4

tôi sẽ tư vấn cho một cái gì đó như:

SELECT * 
FROM `users` 
WHERE dob BETWEEN 
    CURDATE() - INTERVAL 18 YEARS 
    AND CURDATE() - INTERVAL 20 YEARS 

Về mặt kỹ thuật mà sẽ bao gồm những người lần lượt 20 ngày hôm nay. Bạn có thể thay đổi interval thành DATE_ADD và chính xác hơn nếu bạn muốn.

Đây là một chút sạch hơn, bởi vì bạn không cần phải làm lại hai sinh nhật trong PHP (hoặc thần cấm, thủ công) mỗi lần.

+0

Tôi thích ý tưởng không phải làm việc ra những ngày trong PHP mà là những gì tôi đã làm. Nhưng truy vấn này dẫn đến lỗi này: '# 1064 - Bạn có một lỗi trong cú pháp SQL của bạn; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn cho cú pháp đúng để sử dụng gần 'YEARS AND CURDATE() - INTERVAL 20 YEARS LIMIT 0, 30' tại dòng 4' – TK123

+0

Nó có thể cần phải là 'YEAR' (số ít) thay vì 'YEARS' (số nhiều). Ngoài ra, cho rằng đây là một trường ngày chứ không phải là một trường dấu thời gian (đó là những gì tôi thường sử dụng) Tôi không chắc chắn nếu bạn cần dấu ngoặc kép xung quanh nó. Tôi không nghĩ vậy, nhưng tôi sẽ kiểm tra. –

+0

'YEAR' đã loại bỏ lỗi cú pháp nhưng trả về 0 hàng mặc dù tôi có 18 và 19 tuổi trong bảng. – TK123

2

tôi không có đủ uy tín để bình luận, nhưng câu trả lời David Grenier sẽ có tác dụng nếu bạn đặt lớn hơn khoảng thời gian đầu tiên (và NĂM ​​không NĂM, như đã chỉ ra)

SELECT * 
FROM `users` 
WHERE dob BETWEEN 
CURDATE() - INTERVAL 20 YEAR 
AND CURDATE() - INTERVAL 18 YEAR 
Các vấn đề liên quan