sql >> Databasteknik >  >> RDS >> Mysql

MYSQL Hur gör man anpassad månadsskillnad mellan två datum i MYSQL?

Jag tror att den här frågan kommer att göra vad du vill. Den använder

  (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

för att få antalet hela månaders upplevelse för användaren,

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

för att få antalet dagar under den första månaden, och

DAY(CURDATE())

för att få antalet dagar i den aktuella månaden. Antalet två dagar summeras och om summan är> 15 läggs 1 till antalet hela månader, t.ex.

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

Vi kan använda detta uttryck som en JOIN villkor mellan user och allowed_exp_range för att hitta alla användare som har erfarenhet inom ett givet intervall:

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

Utdata (för dina exempeldata, inkluderar alla användare eftersom de alla passar in i ett av upplevelseintervallen):

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

Jag har skapat en liten demo på dbfiddle som visar stegen för att komma fram till resultatet.




  1. MySql cursors.execute() med bara en parameter:Varför är en sträng delad i en lista?

  2. Hur man spårar sidvisningar utan att slå MySQL DB

  3. Rails Migration Skapa tabell Primär nyckel

  4. java.lang.UnsupportedOperationException:org.hibernate.dialect.Oracle10gDialect stöder inte resultatuppsättningar via lagrade procedurer