Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MYSQL Jak wykonać niestandardową różnicę miesięcy między dwiema datami w MYSQL?

Myślę, że to zapytanie zrobi to, co chcesz. Używa

  (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

aby uzyskać liczbę pełnych miesięcy doświadczenia użytkownika,

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

aby uzyskać liczbę dni w pierwszym miesiącu i

DAY(CURDATE())

aby uzyskać liczbę dni w bieżącym miesiącu. Liczby dwóch dni są sumowane i jeśli suma wynosi> 15, 1 dodaje się do liczby pełnych miesięcy, np.

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

Możemy użyć tego wyrażenia jako JOIN warunek między user i allowed_exp_range aby znaleźć wszystkich użytkowników, którzy mają doświadczenie w danym zakresie:

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

Dane wyjściowe (dla przykładowych danych obejmują wszystkich użytkowników, ponieważ wszyscy pasują do jednego z zakresów doświadczenia):

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

Stworzyłem małe demo na temat dbfiddle który pokazuje kroki prowadzące do uzyskania wyniku.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wykonywanie złączeń między wieloma heterogenicznymi bazami danych, np. PostgreSQL i MySQL

  2. Jak zmiana typu pola mysql z INT na VARCHAR wpłynie na dane zapisane wcześniej jako INT?

  3. Nie można połączyć się z serwerem Mysql; Nie można utworzyć/zapisać pliku pid

  4. Wstawianie rekordu do bazy danych MySQL za pomocą C#

  5. UnsupportedOperationException z DriverManager.getConnection() w systemie Android