sql >> Databáze >  >> RDS >> Mysql

MYSQL Jak provést vlastní měsíční rozdíl mezi dvěma daty v MYSQL?

Myslím, že tento dotaz udělá to, co chcete. Používá

  (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

získat počet celých měsíců zkušeností pro uživatele,

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

získat počet dní v prvním měsíci a

DAY(CURDATE())

získat počet dní v aktuálním měsíci. Počty dvou dnů se sečtou a pokud je součet> 15, k počtu celých měsíců se přičte 1, např.

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

Tento výraz můžeme použít jako JOIN podmínky mezi user a allowed_exp_range najít všechny uživatele, kteří mají zkušenosti v daném rozsahu:

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

Výstup (pro vaše ukázková data zahrnuje všechny uživatele, protože všichni zapadají do jednoho z rozsahů zkušeností):

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

Vytvořil jsem malou ukázku na dbfiddle který demonstruje kroky k dosažení výsledku.




  1. Jak porovnat řetězec verze (x.y.z) v MySQL?

  2. SQLiteStatement proveďte SELECT / INSERT / DELETE / UPDATE

  3. Jak vložit časové razítko do Oracle ve specifickém formátu

  4. Udělte vše na konkrétním schématu v db skupinové roli v PostgreSQL