Mysql
 sql >> Base de données >  >> RDS >> Mysql

MYSQL Comment effectuer une différence de mois personnalisée entre deux dates dans MYSQL ?

Je pense que cette requête fera ce que vous voulez. Il utilise

  (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

pour obtenir le nombre de mois entiers d'expérience de l'utilisateur,

  DAY(LAST_DAY(STR_TO_DATE(join_date, '%d-%m-%Y')))
- DAY(STR_TO_DATE(join_date, '%d-%m-%Y'))
+ 1

pour obtenir le nombre de jours du premier mois, et

DAY(CURDATE())

pour obtenir le nombre de jours du mois en cours. Les comptes de deux jours sont additionnés et si le total est> 15, 1 est ajouté au nombre de mois entiers, par exemple

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

Nous pouvons utiliser cette expression comme un JOIN condition entre user et allowed_exp_range pour trouver tous les utilisateurs qui ont de l'expérience dans une plage donnée :

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

Résultat (pour vos exemples de données, inclut tous les utilisateurs, car ils correspondent tous à l'une des plages d'expérience) :

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

J'ai créé une petite démo sur dbfiddle qui montre les étapes pour arriver au résultat.