sql >> Database >  >> RDS >> Mysql

MYSQL Hoe maak ik een aangepast maandverschil tussen twee datums in MYSQL?

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.




  1. Recursieve zoekopdracht in PostgreSQL. KIES *

  2. Routing met AngularJS en Slim PHP

  3. een drijvende naar decimaal casten in mysql

  4. Ontdek bij welk kwartaal een datum hoort in Oracle