Ich denke, diese Abfrage wird tun, was Sie wollen. Es verwendet
(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
um die Anzahl der ganzen Erfahrungsmonate für den Benutzer zu erhalten,
DAY(LAST_DAY(STR_TO_DATE(join_date, '%d-%m-%Y')))
- DAY(STR_TO_DATE(join_date, '%d-%m-%Y'))
+ 1
um die Anzahl der Tage im ersten Monat zu erhalten, und
DAY(CURDATE())
um die Anzahl der Tage im aktuellen Monat zu erhalten. Die zwei Tageszählungen werden summiert und wenn die Summe> 15 ist, wird 1 zur Anzahl der ganzen Monate addiert, z. B.
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
Wir können diesen Ausdruck als JOIN
verwenden Bedingung zwischen user
und allowed_exp_range
um alle Benutzer zu finden, die Erfahrung in einem bestimmten Bereich haben:
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
Ausgabe (beinhaltet für Ihre Beispieldaten alle Benutzer, da sie alle in einen der Erfahrungsbereiche passen):
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
Ich habe eine kleine Demo auf dbfiddle erstellt die die Schritte zum Erreichen des Ergebnisses demonstriert.