Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MYSQL Wie führt man eine benutzerdefinierte Monatsdifferenz zwischen zwei Daten in MYSQL durch?

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.