Bagaimana cara menghitung selisih bulan di MySQL, jadi ketika saya select ada kolom baru bernama selisih_bulan
yang didasarkan pada selisih bulan antara kolom startAt
dengan endAt
, bagaimana caranya ya?
ini tabel saya:
mysql> select * from subscription;
+----+---------------------+---------------------+
| id | startAt | endAt |
+----+---------------------+---------------------+
| 1 | 2023-01-02 00:00:00 | 2023-03-20 00:00:00 |
| 2 | 2023-03-20 00:00:00 | 2023-06-20 00:00:00 |
| 3 | 2023-04-11 00:00:00 | 2023-09-20 00:00:00 |
+----+---------------------+---------------------+
Bisa pakai fungsi TIMESTAMPDIFF().
Fungsi ini akan mengembalikan jumlah bulan yang sudah berlalu, otomatis mengkompensasi jumlah hari yang bervariasi dalam setiap bulan (28,30,31) serta memperhitungkan tahun kabisat, jadi gak perlu khawatir soal hal-hal tersebut.
Kalau untuk kasus seperti yang ditanyakan, bisa pakai ini:
mysql> SELECT *, TIMESTAMPDIFF(MONTH, startAt, endAt) AS selisih_bulan FROM subscription;
+----+---------------------+---------------------+---------------+
| id | startAt | endAt | selisih_bulan |
+----+---------------------+---------------------+---------------+
| 1 | 2023-01-02 00:00:00 | 2023-03-20 00:00:00 | 2 |
| 2 | 2023-03-20 00:00:00 | 2023-06-20 00:00:00 | 3 |
| 3 | 2023-04-11 00:00:00 | 2023-09-20 00:00:00 | 5 |
+----+---------------------+---------------------+---------------+
Kalau mau mendapatkan selisih bulan secara presisi (dengan desimal), bisa menggunakan gabungan fungsi TIMESTAMPDIFF() dan DATEDIFF() seperti ini:
SELECT
*,
(
TIMESTAMPDIFF(MONTH, startAt, endAt) +
DATEDIFF(
endAt,
startAt + INTERVAL
TIMESTAMPDIFF(MONTH, startAt, endAt)
MONTH
) /
DATEDIFF(
startAt + INTERVAL
TIMESTAMPDIFF(MONTH, startAt, endAt) + 1
MONTH,
startAt + INTERVAL
TIMESTAMPDIFF(MONTH, startAt, endAt)
MONTH
)
) as selisih_bulan
FROM subscription;
hasil:
+----+---------------------+---------------------+---------------+
| id | startAt | endAt | selisih_bulan |
+----+---------------------+---------------------+---------------+
| 1 | 2023-01-02 00:00:00 | 2023-03-20 00:00:00 | 2.5806 |
| 2 | 2023-03-20 00:00:00 | 2023-06-20 00:00:00 | 3.0000 |
| 3 | 2023-04-11 00:00:00 | 2023-09-20 00:00:00 | 5.3000 |
+----+---------------------+---------------------+---------------+
Kamu tau jawabannya?
Ayo bergabung bersama lebih dari 200.000 pengguna lainnya!