Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MYSQL Bagaimana cara melakukan perbedaan bulan khusus antara dua tanggal di MYSQL?

Saya pikir kueri ini akan melakukan apa yang Anda inginkan. Ini menggunakan

  (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

untuk mendapatkan jumlah pengalaman sebulan penuh bagi pengguna,

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

untuk mendapatkan jumlah hari dalam bulan pertama, dan

DAY(CURDATE())

untuk mendapatkan jumlah hari dalam bulan ini. Hitungan dua hari dijumlahkan dan jika totalnya> 15, 1 ditambahkan ke jumlah bulan penuh mis.

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

Kita dapat menggunakan ekspresi ini sebagai JOIN kondisi antara user dan allowed_exp_range untuk menemukan semua pengguna yang memiliki pengalaman dalam rentang tertentu:

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

Output (untuk data sampel Anda, termasuk semua pengguna karena mereka semua cocok dengan salah satu rentang pengalaman):

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

Saya telah membuat demo kecil di dbfiddle yang menunjukkan langkah-langkah untuk mencapai hasil.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa susunan MySQL terbaik untuk bahasa Jerman?

  2. Node.js, Request, MySQL, dan Connection Pooling mengarah ke Perilaku Pemblokiran/Pembekuan Tanpa Batas?

  3. Bagaimana cara mendapatkan waktu eksekusi kueri MySQL dari PHP?

  4. konversi microsoft sql ke mysql

  5. masalah mysqli_real_escape_string dan tanda kutip ganda