Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MYSQL Làm cách nào để thực hiện chênh lệch tháng tùy chỉnh giữa hai ngày trong MYSQL?

Tôi nghĩ rằng truy vấn này sẽ làm những gì bạn muốn. Nó sử dụng

  (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

để có được số tháng trải nghiệm cho người dùng,

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

để biết số ngày trong tháng đầu tiên và

DAY(CURDATE())

để biết số ngày trong tháng hiện tại. Tổng số hai ngày được cộng lại và nếu tổng số> 15, thì 1 sẽ được cộng vào số cả tháng, ví dụ:

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

Chúng ta có thể sử dụng biểu thức này làm JOIN điều kiện giữa userallowed_exp_range để tìm tất cả người dùng có kinh nghiệm trong một phạm vi nhất định:

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

Đầu ra (đối với dữ liệu mẫu của bạn, bao gồm tất cả người dùng vì tất cả họ đều phù hợp với một trong các phạm vi trải nghiệm):

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

Tôi đã tạo một bản demo nhỏ trên dbfiddle minh họa các bước đi đến kết quả.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đá quý Ruby mysql2 được biên dịch cho phiên bản thư viện máy khách mysql sai

  2. Đạt được Dự phòng &Dự phòng MySQL trên Google Cloud Platform (GCP)

  3. CakePHP - chạy truy vấn cuối cùng

  4. MySQL không kết nối trong cmd

  5. Cập nhật MYSQL với lỗi truy vấn con WHERE SELECT