Pernah nggak kamu belanja online, terus di halaman pesanan muncul tulisan "Pesanan tiba dalam 3 hari lagi" atau "Bergabung sejak 2 tahun lalu"? Di balik angka-angka ajaib itu, ada satu hal yang bekerja keras di database — yaitu fungsi tanggal MySQL. Tanpa mereka, developer harus hitung manual satu per satu. Kebayang betapa ribetnya!
Di artikel ke-19 dari seri 28 artikel Belajar Query SQL MySQL ini, kita akan kupas tuntas bagaimana MySQL menangani data tanggal dan waktu. Kamu akan belajar fungsi-fungsi penting seperti NOW(), DATE(), YEAR(), MONTH(), dan DATEDIFF() — lengkap dengan studi kasus toko online yang seru dan relatable.
Setelah baca artikel ini, kamu bakal bisa: mengambil waktu saat ini secara otomatis, memfilter data berdasarkan bulan atau tahun tertentu, dan menghitung selisih antar tanggal layaknya seorang developer profesional. Siap? Let's go! ๐
Fakta Menarik
MySQL memiliki lebih dari 30+ fungsi bawaan untuk mengelola tanggal dan waktu. Di balik fitur "tanggal kadaluarsa produk" atau "riwayat transaksi 30 hari terakhir" di e-commerce besar seperti Tokopedia atau Shopee, fungsi-fungsi inilah yang menjadi tulang punggungnya. Menguasainya = kamu satu langkah lebih dekat jadi backend developer sungguhan!
๐ Sintaks Lengkap Fungsi Tanggal MySQL
Sebelum masuk ke contoh, kenali dulu sintaks lengkapnya biar nggak salah tulis:
-- 1. NOW() — Mengambil tanggal dan waktu saat ini SELECT NOW(); -- Output: 2025-08-15 10:30:45 -- 2. DATE() — Mengambil bagian tanggal saja dari DATETIME SELECT DATE(kolom_datetime); -- Output: 2025-08-15 -- 3. YEAR() — Mengambil tahun dari sebuah tanggal SELECT YEAR(kolom_tanggal); -- Output: 2025 -- 4. MONTH() — Mengambil bulan (angka 1–12) SELECT MONTH(kolom_tanggal); -- Output: 8 -- 5. DAY() — Mengambil hari (tanggal angka) SELECT DAY(kolom_tanggal); -- Output: 15 -- 6. DATEDIFF() — Selisih hari antara dua tanggal SELECT DATEDIFF(tanggal_akhir, tanggal_awal); -- Output: angka positif/negatif (selisih hari) -- 7. DATE_FORMAT() — Format tampilan tanggal SELECT DATE_FORMAT(kolom_tanggal, '%d %M %Y'); -- Output: 15 August 2025
1. Fungsi NOW() dan DATE() — "Jam Tangan" Database
Bayangkan database seperti seorang kasir toko. Setiap kali ada transaksi masuk, si kasir langsung mencatat: "Pesanan ini masuk jam berapa, hari ini tanggal berapa." Nah, fungsi NOW() adalah jam tangan si kasir — dia tahu waktu terkini secara real-time.
Sementara DATE() berfungsi untuk "mengupas" bagian waktu dari kolom DATETIME, menyisakan tanggalnya saja. Ini berguna saat kamu cuma butuh info hari transaksi, bukan jam persisnya.
-- Mencatat pesanan baru dengan timestamp otomatis INSERT INTO pesanan (id_pelanggan, total_harga, tanggal_pesan) VALUES (101, 250000, NOW()); -- Ambil semua pesanan hari ini saja (tanpa jam) SELECT id_pesanan, id_pelanggan, DATE(tanggal_pesan) AS tgl_transaksi, total_harga FROM pesanan WHERE DATE(tanggal_pesan) = DATE(NOW());
๐ Hasil Query:
| id_pesanan | id_pelanggan | tgl_transaksi | total_harga |
|---|---|---|---|
| P-0091 | 101 | 2025-08-15 | 250.000 |
| P-0092 | 104 | 2025-08-15 | 185.000 |
| P-0093 | 107 | 2025-08-15 | 620.000 |
✅ Tip Praktis
Saat membuat tabel pesanan di toko online, biasakan set kolom tanggal dengan tipe DATETIME dan nilai default CURRENT_TIMESTAMP. Dengan begitu, MySQL otomatis mengisi waktu tanpa kamu perlu tulis NOW() setiap insert!
2. Fungsi YEAR(), MONTH(), DAY() — Bedah Tanggal Lapis demi Lapis
Kalau DATE() itu seperti mengambil seluruh amplop tanggal, maka YEAR(), MONTH(), dan DAY() adalah pinset yang membedah isi amplop itu satu per satu. Ini adalah senjata utama saat kamu perlu filter data berdasarkan periode — misalnya laporan penjualan bulan Agustus saja, atau rekap tahunan 2024.
Dalam konteks toko online, fungsi tanggal MySQL ini sangat sering dipakai untuk membuat laporan penjualan bulanan atau mengetahui produk paling laris di bulan tertentu.
-- Total penjualan per bulan di tahun 2025 SELECT YEAR(tanggal_pesan) AS tahun, MONTH(tanggal_pesan) AS bulan, COUNT(*) AS jumlah_pesanan, SUM(total_harga) AS total_pendapatan FROM pesanan WHERE YEAR(tanggal_pesan) = 2025 GROUP BY YEAR(tanggal_pesan), MONTH(tanggal_pesan) ORDER BY bulan ASC;
๐ Hasil Query:
| tahun | bulan | jumlah_pesanan | total_pendapatan |
|---|---|---|---|
| 2025 | 6 | 142 | 28.450.000 |
| 2025 | 7 | 187 | 35.200.000 |
| 2025 | 8 | 214 | 41.750.000 |
⚠️ Peringatan
Menggunakan fungsi seperti YEAR(tanggal_pesan) dalam klausa WHERE bisa memperlambat query jika tabelnya besar, karena MySQL tidak bisa memakai index kolom tersebut secara optimal. Alternatifnya: gunakan WHERE tanggal_pesan BETWEEN '2025-01-01' AND '2025-12-31' untuk performa lebih baik di data besar.
3. Fungsi DATEDIFF() & DATE_FORMAT() — Hitung Jarak dan Tampilkan Cantik
Kalau kamu pernah lihat fitur "Pengiriman sudah 5 hari, segera konfirmasi!" di marketplace, di sanalah DATEDIFF() beraksi. Fungsi ini menghitung selisih hari antara dua tanggal. Simpel, tapi super powerful!
Sementara DATE_FORMAT() adalah "stylist" tanggal — dia yang memastikan tampilan tanggal di aplikasi kamu terlihat rapi dan sesuai kebutuhan, misalnya dari format 2025-08-15 jadi 15 Agustus 2025.
-- Hitung umur pesanan (sudah berapa hari) + format tanggal cantik SELECT id_pesanan, DATE_FORMAT(tanggal_pesan, '%d %M %Y') AS tanggal_tampil, status_pesanan, DATEDIFF(NOW(), tanggal_pesan) AS hari_sejak_pesan FROM pesanan WHERE status_pesanan = 'dikirim' AND DATEDIFF(NOW(), tanggal_pesan) > 3 ORDER BY hari_sejak_pesan DESC;
๐ Hasil Query:
| id_pesanan | tanggal_tampil | status_pesanan | hari_sejak_pesan |
|---|---|---|---|
| P-0078 | 08 August 2025 | dikirim | 7 |
| P-0082 | 10 August 2025 | dikirim | 5 |
| P-0086 | 11 August 2025 | dikirim | 4 |
✅ Tip Praktis
Format paling sering dipakai di DATE_FORMAT(): %d (hari 2 digit), %m (bulan angka), %M (nama bulan Inggris), %Y (tahun 4 digit), %H:%i (jam:menit). Kombinasikan sesuai kebutuhan aplikasimu!
4. Bonus: CURDATE() dan DATE_ADD() — Manipulasi Tanggal Secara Dinamis
Dua fungsi bonus ini sering jadi pelengkap combo yang lengkap. CURDATE() mirip NOW() tapi mengembalikan tanggal hari ini saja (tanpa jam). Sedangkan DATE_ADD() bisa "menambahkan" hari, bulan, atau tahun ke sebuah tanggal — berguna misalnya untuk menghitung tanggal kadaluarsa garansi produk atau batas masa promo.
-- Hitung estimasi tiba (3 hari dari tanggal pesan) -- dan cek apakah garansi 1 tahun masih aktif SELECT id_pesanan, tanggal_pesan, DATE_ADD(tanggal_pesan, INTERVAL 3 DAY) AS estimasi_tiba, DATE_ADD(tanggal_pesan, INTERVAL 1 YEAR) AS garansi_hingga, CASE WHEN CURDATE() <= DATE_ADD(tanggal_pesan, INTERVAL 1 YEAR) THEN 'Aktif' ELSE 'Kedaluwarsa' END AS status_garansi FROM pesanan LIMIT 3;
๐ Hasil Query:
| id_pesanan | tanggal_pesan | estimasi_tiba | garansi_hingga | status_garansi |
|---|---|---|---|---|
| P-0078 | 2025-08-08 | 2025-08-11 | 2026-08-08 | Aktif |
| P-0042 | 2024-05-20 | 2024-05-23 | 2025-05-20 | Kedaluwarsa |
| P-0055 | 2025-03-10 | 2025-03-13 | 2026-03-10 | Aktif |
๐งช Langkah Praktikum — Coba Sendiri dari Nol!
Buat Database dan Tabel Latihan
Buka MySQL Workbench atau terminal MySQL kamu, lalu jalankan script ini untuk membuat environment latihan.
CREATE DATABASE db_toko; USE db_toko; CREATE TABLE pesanan ( id_pesanan VARCHAR(10) PRIMARY KEY, id_pelanggan INT, total_harga DECIMAL(12,2), status_pesanan VARCHAR(20), tanggal_pesan DATETIME DEFAULT CURRENT_TIMESTAMP );
Insert Data Sample
Isi tabel dengan beberapa baris data dengan tanggal yang bervariasi agar fungsi tanggal MySQL kelihatan hasilnya.
INSERT INTO pesanan VALUES ('P-0078', 101, 250000, 'dikirim', '2025-08-08 09:15:00'), ('P-0082', 104, 185000, 'dikirim', '2025-08-10 14:22:00'), ('P-0086', 107, 620000, 'dikirim', '2025-08-11 08:00:00'), ('P-0091', 101, 250000, 'selesai', NOW()), ('P-0042', 102, 450000, 'selesai', '2024-05-20 11:00:00');
Eksplorasi Setiap Fungsi
Jalankan query berikut satu per satu dan perhatikan outputnya. Ini cara paling efektif untuk memahami perbedaan tiap fungsi.
SELECT tanggal_pesan, NOW() AS waktu_sekarang, DATE(tanggal_pesan) AS hanya_tanggal, YEAR(tanggal_pesan) AS tahun, MONTH(tanggal_pesan) AS bulan, DAY(tanggal_pesan) AS hari, DATEDIFF(NOW(), tanggal_pesan) AS umur_hari FROM pesanan;
Tantangan Mini — Coba Sendiri!
Coba buat query: "Tampilkan semua pesanan yang dilakukan dalam 7 hari terakhir, dengan format tanggal dd/mm/yyyy, diurutkan dari yang terbaru." Gunakan kombinasi DATEDIFF, DATE_FORMAT, dan ORDER BY!
๐ Tabel Ringkasan Fungsi Tanggal MySQL
| Fungsi | Kegunaan | Contoh Input | Output |
|---|---|---|---|
NOW() |
Waktu saat ini (datetime) | — | 2025-08-15 10:30:45 |
CURDATE() |
Tanggal hari ini saja | — | 2025-08-15 |
DATE() |
Ambil bagian tanggal dari DATETIME | 2025-08-15 10:30:45 | 2025-08-15 |
YEAR() |
Ambil tahun | 2025-08-15 | 2025 |
MONTH() |
Ambil bulan (1–12) | 2025-08-15 | 8 |
DAY() |
Ambil tanggal (1–31) | 2025-08-15 | 15 |
DATEDIFF() |
Selisih hari antara 2 tanggal | NOW(), '2025-08-01' | 14 |
DATE_ADD() |
Tambah hari/bulan/tahun ke tanggal | '2025-08-15', INTERVAL 3 DAY | 2025-08-18 |
DATE_FORMAT() |
Format tampilan tanggal | '2025-08-15', '%d %M %Y' | 15 August 2025 |
Tips dari Lapangan #1
Selalu simpan tanggal dengan tipe DATETIME (bukan VARCHAR!) di tabelmu. Banyak pemula yang menyimpan tanggal sebagai string seperti '15-08-2025' dan akhirnya tidak bisa menggunakan fungsi tanggal MySQL sama sekali. Tipe data yang benar = query yang benar!
Tips dari Lapangan #2
Untuk laporan bisnis profesional, kombinasikan YEAR() + MONTH() + SUM() + GROUP BY. Hasilnya bisa langsung jadi data mentah untuk grafik penjualan bulanan di dashboard admin — persis seperti yang dipakai tim data analyst di perusahaan e-commerce sungguhan!
๐ Kesimpulan — Kamu Sudah Menguasai Waktu!
Setelah mempelajari fungsi tanggal MySQL di artikel ke-19 ini, kamu sudah punya bekal yang cukup solid. Berikut poin-poin penting yang sudah kita bahas:
- ✦ NOW() dan CURDATE() — mengambil waktu/tanggal saat ini secara otomatis
- ✦ DATE() — mengupas bagian tanggal dari kolom DATETIME
- ✦ YEAR(), MONTH(), DAY() — membedah komponen tanggal untuk filter dan GROUP BY
- ✦ DATEDIFF() — menghitung selisih hari antara dua tanggal
- ✦ DATE_ADD() — menambahkan interval waktu ke sebuah tanggal
- ✦ DATE_FORMAT() — memformat tampilan tanggal sesuai kebutuhan aplikasi
Ingat — developer yang baik bukan cuma yang bisa nulis query, tapi yang tahu fungsi yang tepat untuk masalah yang tepat. Fungsi tanggal MySQL adalah salah satu skill yang akan selalu kamu pakai, dari project kuliah sampai kerja di startup. Keep practicing! ๐ช
Artikel ini bermanfaat? Yuk bantu sebar! ๐
Share ke teman sekelas, komen pengalaman kamu mencoba query-nya, atau bookmark seri ini biar nggak ketinggalan artikel berikutnya. Kalau ada pertanyaan, langsung tulis di kolom komentar ya!
Artikel 18/28: Fungsi String — CONCAT, LENGTH, dan Lainnya
Memanipulasi teks langsung di query menggunakan CONCAT, LENGTH, UPPER, LOWER, SUBSTRING, TRIM.
Artikel 20/28: Menggabungkan Tabel — INNER JOIN
Kuasai dasar JOIN untuk menggabungkan data dari dua tabel berbeda — skill wajib developer SQL.
No comments:
Post a Comment