Myślę, że to zapytanie zrobi to, co chcesz. Używa
(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
aby uzyskać liczbę pełnych miesięcy doświadczenia użytkownika,
DAY(LAST_DAY(STR_TO_DATE(join_date, '%d-%m-%Y')))
- DAY(STR_TO_DATE(join_date, '%d-%m-%Y'))
+ 1
aby uzyskać liczbę dni w pierwszym miesiącu i
DAY(CURDATE())
aby uzyskać liczbę dni w bieżącym miesiącu. Liczby dwóch dni są sumowane i jeśli suma wynosi> 15, 1 dodaje się do liczby pełnych miesięcy, np.
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
Możemy użyć tego wyrażenia jako JOIN
warunek między user
i allowed_exp_range
aby znaleźć wszystkich użytkowników, którzy mają doświadczenie w danym zakresie:
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
Dane wyjściowe (dla przykładowych danych obejmują wszystkich użytkowników, ponieważ wszyscy pasują do jednego z zakresów doświadczenia):
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
Stworzyłem małe demo na temat dbfiddle który pokazuje kroki prowadzące do uzyskania wyniku.