Mysql
 sql >> база данни >  >> RDS >> Mysql

MYSQL Как да изпълним персонализирана месечна разлика между две дати в MYSQL?

Мисля, че тази заявка ще направи това, което искате. Той използва

  (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

за да получите броя цели месеци опит за потребителя,

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

за да получите броя на дните през първия месец и

DAY(CURDATE())

за да получите броя на дните в текущия месец. Броят на двата дни се сумира и ако общата сума е> 15, 1 се добавя към броя на целите месеци, напр.

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

Можем да използваме този израз като JOIN условие между user и allowed_exp_range за да намерите всички потребители, които имат опит в даден диапазон:

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

Резултат (за вашите примерни данни, включва всички потребители, тъй като всички те попадат в един от диапазоните на опит):

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

Създадох малко демо на dbfiddle което демонстрира стъпките за достигане на резултата.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да вмъкна много записи в MySQL по-бързо, Java?

  2. MySQL:Как да копирам редове, но да променям няколко полета?

  3. Как да използвате ядрото на AspNet.Identity в My Sql база данни

  4. Какъв е най-добрият начин да вмъкнете няколко реда в mysql база данни с помощта на php?

  5. Mysql деактивира временно колоната auto_increment в Съхранената процедура