Tôi nghĩ rằng truy vấn này sẽ làm những gì bạn muốn. Nó sử dụng
(YEAR(CURDATE())*12+MONTH(CURDATE()))
- (YEAR(STR_TO_DATE(join_date, '%d-%m-%Y'))*12+MONTH(STR_TO_DATE(join_date, '%d-%m-%Y'))) -
- 1
để có được số tháng trải nghiệm cho người dùng,
DAY(LAST_DAY(STR_TO_DATE(join_date, '%d-%m-%Y')))
- DAY(STR_TO_DATE(join_date, '%d-%m-%Y'))
+ 1
để biết số ngày trong tháng đầu tiên và
DAY(CURDATE())
để biết số ngày trong tháng hiện tại. Tổng số hai ngày được cộng lại và nếu tổng số> 15, thì 1 sẽ được cộng vào số cả tháng, ví dụ:
SELECT id
, name
, (YEAR(CURDATE())*12+MONTH(CURDATE())) - (YEAR(STR_TO_DATE(join_date, '%d-%m-%Y'))*12+MONTH(STR_TO_DATE(join_date, '%d-%m-%Y'))) - 1 -- whole months
+ CASE WHEN DAY(LAST_DAY(STR_TO_DATE(join_date, '%d-%m-%Y'))) - DAY(STR_TO_DATE(join_date, '%d-%m-%Y')) + 1 + DAY(CURDATE()) > 15 THEN 1 ELSE 0 END -- broken month
AS months
FROM user
Chúng ta có thể sử dụng biểu thức này làm JOIN
điều kiện giữa user
và allowed_exp_range
để tìm tất cả người dùng có kinh nghiệm trong một phạm vi nhất định:
SELECT u.id
, u.name
, a.starting_exp_months
, a.end_exp_months
FROM user u
JOIN allowed_exp_range a
ON (YEAR(CURDATE())*12+MONTH(CURDATE())) - (YEAR(STR_TO_DATE(u.join_date, '%d-%m-%Y'))*12+MONTH(STR_TO_DATE(u.join_date, '%d-%m-%Y'))) - 1
+ CASE WHEN DAY(LAST_DAY(STR_TO_DATE(u.join_date, '%d-%m-%Y'))) - DAY(STR_TO_DATE(u.join_date, '%d-%m-%Y')) + 1 + DAY(CURDATE()) > 15 THEN 1 ELSE 0 END
BETWEEN a.starting_exp_months AND a.end_exp_months
Đầu ra (đối với dữ liệu mẫu của bạn, bao gồm tất cả người dùng vì tất cả họ đều phù hợp với một trong các phạm vi trải nghiệm):
id name starting_exp_months end_exp_months
1 Sam 9 24
2 Moe 9 24
3 Tim 0 6
4 Sal 9 24
5 Joe 0 6
Tôi đã tạo một bản demo nhỏ trên dbfiddle minh họa các bước đi đến kết quả.