Jeg tror, at denne forespørgsel vil gøre, hvad du vil. Den bruger
(ÅR(CURDATE())*12+MONTH(CURDATE()))- (ÅR(STR_TO_DATE(tilmeldingsdato, '%d-%m-%Y'))*12+MONTH(STR_TO_DATE( join_date, '%d-%m-%Y'))) -- 1
for at få antallet af hele måneders oplevelse for brugeren,
DAY(LAST_DAY(STR_TO_DATE(join_date, '%d-%m-%Y')))- DAY(STR_TO_DATE(join_date, '%d-%m-%Y'))+ 1
for at få antallet af dage i den første måned, og
DAG(CURDATE())
for at få antallet af dage i den aktuelle måned. De to dages tællinger summeres, og hvis totalen er> 15, lægges 1 til antallet af hele måneder, f.eks.
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 -- hele måneder + 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 ANDES 0 END -- brudt måned AS monthsFROM user
Vi kan bruge dette udtryk som en JOIN
tilstand mellem bruger
og allowed_exp_range
for at finde alle brugere, der har erfaring inden for et givet område:
SELECT u.id , u.name , a.starting_exp_months , a.end_exp_monthsFROM user uJOIN allow_exp_range aON (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 ANDET 0 SLUT MELLEM a.starting_exp_months OG a.end_exp_months
Output (for dine eksempeldata inkluderer alle brugere, da de alle passer ind i et af oplevelsesintervallerne):
id-navn start_exp_months end_exp_months1 Sam 9 242 Moe 9 243 Tim 0 64 Sal 9 245 Joe 0 6
Jeg har oprettet en lille demo på dbfiddle som demonstrerer trinene i at nå frem til resultatet.