Ik denk dat deze query zal doen wat je wilt. Het gebruikt
(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
om het aantal hele maanden ervaring voor de gebruiker te krijgen,
DAY(LAST_DAY(STR_TO_DATE(join_date, '%d-%m-%Y')))
- DAY(STR_TO_DATE(join_date, '%d-%m-%Y'))
+ 1
om het aantal dagen in de eerste maand te krijgen, en
DAY(CURDATE())
om het aantal dagen in de huidige maand te krijgen. De tellingen van twee dagen worden opgeteld en als het totaal> 15 is, wordt 1 opgeteld bij het aantal hele maanden, bijvoorbeeld
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
We kunnen deze uitdrukking gebruiken als een JOIN
voorwaarde tussen user
en allowed_exp_range
om alle gebruikers te vinden die ervaring hebben binnen een bepaald bereik:
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
Uitvoer (voor uw voorbeeldgegevens, inclusief alle gebruikers omdat ze allemaal in een van de ervaringsbereiken 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
Ik heb een kleine demo op dbfiddle gemaakt die de stappen demonstreert om tot het resultaat te komen.