Fungsi Tanggal & Waktu: YEAR, DATE_FORMAT, DATEDIFF, DATE_ADD
Mengolah tanggal: mengambil tahun/bulan/hari, memformat tampilan dengan DATE_FORMAT, menghitung selisih hari, menambah interval, dan kebiasaan benar menyimpan tanggal.
Tanggal itu istimewa
Hampir semua bisnis bertanya soal waktu: "penjualan bulan ini", "pelanggan yang sudah 30 hari tidak belanja", "umur akun". MySQL punya banyak fungsi tanggal. Ingat formatnya: DATE = 'YYYY-MM-DD', DATETIME = 'YYYY-MM-DD HH:MM:SS'.
Waktu sekarang
SELECT NOW(); -- 2024-03-15 14:30:05 (tanggal + jam)
SELECT CURDATE(); -- 2024-03-15 (tanggal saja)
SELECT CURTIME(); -- 14:30:05 (jam saja)
Mengambil bagian tanggal
| Fungsi | Contoh dengan '2024-03-15' | Hasil |
|---|---|---|
YEAR(d) | YEAR('2024-03-15') | 2024 |
MONTH(d) | MONTH('2024-03-15') | 3 |
DAY(d) | DAY('2024-03-15') | 15 |
DAYNAME(d) | DAYNAME('2024-03-15') | Friday |
MONTHNAME(d) | MONTHNAME('2024-03-15') | March |
QUARTER(d) | QUARTER('2024-03-15') | 1 |
Memformat tampilan: DATE_FORMAT
SELECT DATE_FORMAT('2024-03-15', '%d-%m-%Y'); -- 15-03-2024
SELECT DATE_FORMAT('2024-03-15', '%d %M %Y'); -- 15 March 2024
SELECT DATE_FORMAT(NOW(), '%H:%i'); -- 14:30
| Kode | Arti | Kode | Arti |
|---|---|---|---|
%Y | tahun 4 digit | %H | jam 00-23 |
%y | tahun 2 digit | %i | menit |
%m | bulan 01-12 | %s | detik |
%d | tanggal 01-31 | %M / %b | nama bulan / singkatannya |
%W / %a | nama hari / singkatannya | %j | hari ke-n dalam tahun |
Menghitung selisih dan menambah
SELECT DATEDIFF('2024-03-15', '2024-03-01'); -- 14 (hari)
SELECT TIMESTAMPDIFF(MONTH, '2023-01-15', '2024-03-15'); -- 14 (bulan)
SELECT DATE_ADD('2024-01-31', INTERVAL 1 MONTH); -- 2024-02-29
SELECT DATE_SUB('2024-03-15', INTERVAL 7 DAY); -- 2024-03-08
Unit interval: DAY, WEEK, MONTH, QUARTER, YEAR, HOUR, MINUTE, SECOND. DATEDIFF(a, b) = a dikurangi b, jadi tanggal yang lebih baru diletakkan di depan.
Menyaring berdasarkan tanggal
-- pesanan bulan Maret 2024
SELECT * FROM pesanan WHERE YEAR(tanggal) = 2024 AND MONTH(tanggal) = 3;
-- cara yang lebih cepat (bisa memakai index): rentang
SELECT * FROM pesanan WHERE tanggal >= '2024-03-01' AND tanggal < '2024-04-01';
-- pesanan 30 hari terakhir
SELECT * FROM pesanan WHERE tanggal >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);
Jangan simpan tanggal sebagai teks seperti '15/03/2024' di kolom VARCHAR. Kamu kehilangan kemampuan mengurutkan, menghitung selisih, dan memakai semua fungsi di atas. Selalu pakai tipe DATE/DATETIME, dan format tampilannya di belakang dengan DATE_FORMAT.