TL;DR
YTD, QTD, dan MTD di SQL dihitung dengan nyaring tanggal mulai dari awal periode sampai hari ini pakai DATE_TRUNC. YTD dari awal tahun, QTD dari awal kuartal, MTD dari awal bulan. Kamu bisa gabung ketiganya dalam satu query pakai SUM dengan FILTER biar sekali jalan langsung dapet tiga angka.
YTD, QTD, dan MTD di SQL dihitung dengan nyaring baris mulai dari awal periode sampai hari ini, terus dijumlah. YTD dari awal tahun, QTD dari awal kuartal, MTD dari awal bulan.
Ketiga metrik ini muncul di hampir semua dashboard penjualan. Bos kamu pengin tahu 'total omzet tahun ini sampai sekarang berapa' tanpa harus nunggu tutup buku.
Di sini kamu bakal belajar cara ngitung masing-masing pakai DATE_TRUNC, terus digabung jadi satu query yang sekali jalan langsung ngasih tiga angka.
YTD (year to date), QTD (quarter to date), dan MTD (month to date) adalah total nilai dari awal sebuah periode sampai tanggal hari ini. Bedanya cuma di titik awal. YTD mulai dari 1 Januari, QTD dari hari pertama kuartal berjalan, dan MTD dari tanggal 1 bulan berjalan.
Contoh biar kebayang. Kalau hari ini 19 Juli 2026, maka YTD ngitung sejak 1 Januari 2026, QTD sejak 1 Juli 2026 (awal kuartal ketiga), dan MTD sejak 1 Juli 2026 juga.
Kunci utamanya ada di fungsi DATE_TRUNC. Fungsi ini motong tanggal ke awal periode. DATE_TRUNC('year', tanggal) bakal balikin tanggal 1 Januari dari tahun tanggal itu. Jadi kamu nggak usah nulis '2026-01-01' manual.
SELECT SUM(nominal) AS ytd
FROM penjualan
WHERE tanggal >= DATE_TRUNC('year', CURRENT_DATE)
AND tanggal <= CURRENT_DATE;
Baca query-nya gini: ambil semua baris yang tanggalnya dari awal tahun sampai hari ini, terus jumlahin kolom nominal. CURRENT_DATE adalah tanggal hari ini menurut database. Karena semuanya dinamis, query ini tetep bener walau dijalanin bulan depan atau tahun depan.
Polanya persis sama, kamu cuma ganti argumen pertama DATE_TRUNC. Buat QTD pakai 'quarter', buat MTD pakai 'month'. Ini tabel ringkasnya.
| Metrik | Titik awal | DATE_TRUNC |
|---|---|---|
| YTD | Awal tahun | DATE_TRUNC('year', CURRENT_DATE) |
| QTD | Awal kuartal | DATE_TRUNC('quarter', CURRENT_DATE) |
| MTD | Awal bulan | DATE_TRUNC('month', CURRENT_DATE) |
Jadi query MTD tinggal begini.
SELECT SUM(nominal) AS mtd
FROM penjualan
WHERE tanggal >= DATE_TRUNC('month', CURRENT_DATE)
AND tanggal <= CURRENT_DATE;
Jalanin tiga query terpisah itu boros. Kamu bisa dapet ketiganya sekaligus pakai SUM dengan FILTER. Klausa FILTER bikin satu SUM cuma ngitung baris yang lolos kondisi tertentu.
SELECT
SUM(nominal) FILTER (WHERE tanggal >= DATE_TRUNC('year', CURRENT_DATE)) AS ytd,
SUM(nominal) FILTER (WHERE tanggal >= DATE_TRUNC('quarter', CURRENT_DATE)) AS qtd,
SUM(nominal) FILTER (WHERE tanggal >= DATE_TRUNC('month', CURRENT_DATE)) AS mtd
FROM penjualan
WHERE tanggal <= CURRENT_DATE;
Sekali jalan, kamu dapet tiga kolom: ytd, qtd, mtd. Ini yang biasa nempel di kartu ringkasan atas dashboard.
Anggap toko_berkah, UMKM sembako di Bandung, punya tabel penjualan dengan kolom tanggal dan nominal. Pemiliknya mau tahu performa sampai hari ini, 19 Juli 2026.
Dari sampel data ngulikdata, query gabungan tadi ngasih hasil kayak gini.
| YTD | QTD | MTD |
|---|---|---|
| Rp 487.300.000 | Rp 96.200.000 | Rp 96.200.000 |
Perhatiin QTD sama MTD angkanya sama persis, yaitu Rp 96.200.000. Itu bukan salah query. Tanggal 19 Juli masih di kuartal tiga yang baru mulai 1 Juli, jadi rentang QTD dan MTD kebetulan sama. Begitu masuk Agustus, dua angka ini bakal beda lagi.
Insight kecil yang berguna: MTD sudah nyentuh sekitar 20 persen dari total YTD cuma dalam 19 hari pertama Juli. Itu sinyal bulan ini lagi rame, mungkin ada momen belanja tertentu yang perlu dicek lebih lanjut.
Nulis tanggal awal manual. Banyak yang nulis WHERE tanggal >= '2026-01-01'. Query-nya bener sekarang, tapi 1 Januari tahun depan hasilnya jadi salah dan kamu harus edit ulang. Selalu pakai DATE_TRUNC biar dinamis.
Lupa batas atas. Kalau tabel kamu punya data masa depan (misalnya order terjadwal), tanpa AND tanggal <= CURRENT_DATE angkanya bakal kebawa. Kasih batas atas biar aman.
Salah tipe data tanggal. Kalau kolom tanggal kamu tersimpan sebagai teks, DATE_TRUNC bakal error atau ngasih hasil ngawur. Pastiin kolomnya bertipe date atau timestamp. Detail sintaks fungsi tanggal bisa kamu cek di dokumentasi resmi PostgreSQL.
Pertanyaan yang sering muncul soal YTD, QTD, dan MTD di SQL.
Ketiganya sama-sama ngukur total dari awal periode sampai hari ini, bedanya cuma di titik awalnya. YTD mulai dari 1 Januari tahun berjalan, QTD dari hari pertama kuartal berjalan, dan MTD dari tanggal 1 bulan berjalan. Kalau sekarang 19 Juli, YTD ngitung sejak 1 Januari, QTD sejak 1 Juli, dan MTD juga sejak 1 Juli.
DATE_TRUNC otomatis ngambil awal periode berdasarkan tanggal hari ini, jadi query kamu nggak perlu diubah tiap ganti bulan. Kalau kamu nulis '2026-01-01' manual, awal tahun depan query-nya bakal salah dan kamu harus edit lagi. DATE_TRUNC bikin laporan jalan sendiri tanpa disentuh.
MySQL nggak punya DATE_TRUNC, tapi kamu bisa tiru pakai fungsi lain. Buat awal bulan pakai DATE_FORMAT(CURDATE(), '%Y-%m-01'), buat awal tahun pakai MAKEDATE(YEAR(CURDATE()), 1). Untuk awal kuartal, hitung bulannya dulu pakai QUARTER(). Logikanya sama, cuma sintaksnya beda.
Bisa, tinggal geser acuannya pakai interval. Buat batas atas, ganti CURRENT_DATE jadi CURRENT_DATE - INTERVAL '1 year'. Buat batas bawah, pakai DATE_TRUNC('year', CURRENT_DATE - INTERVAL '1 year'). Dengan begitu kamu bisa bandingin YTD tahun ini sama YTD periode yang sama tahun lalu.
Mirip tapi nggak persis sama. Running total nambah nilai baris per baris sepanjang waktu, sedangkan YTD adalah satu angka total dari awal tahun sampai hari ini. Running total bisa dipakai buat bikin grafik naik, sementara YTD lebih ke ringkasan satu angka buat dashboard atau laporan.
Inti dari YTD, QTD, dan MTD cuma satu: tentuin titik awal pakai DATE_TRUNC, batasi sampai CURRENT_DATE, terus jumlahin. Buat efisiensi, gabung ketiganya pakai SUM dengan FILTER biar sekali query langsung dapet tiga angka.
Mau lanjut ke metrik waktu yang lebih dinamis? Cek cara ngitung rolling 7 hari di SQL, atau pelajari date bucketing buat ngelompokin data per rentang waktu.
Pengin lancar nulis query analitik yang beneran dipakai di kerjaan? Latihan langsung di NgulikSQL, lengkap sama dataset toko biar kamu terbiasa sama kasus nyata.
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Nambah 30 hari ke tanggal invoice, ngurangin sebulan buat cari periode lalu, ngitung selisih hari antar order. Semua itu aritmetika tanggal, dan SQL punya operator INTERVAL buat ngerjainnya.
Ngurangin tahun sekarang sama tahun lahir kelihatan gampang, tapi hasilnya sering meleset setahun kalau ulang tahunnya belum lewat. Ini cara hitung umur yang akurat di SQL.
Cara pakai DATE_TRUNC di SQL buat memotong timestamp jadi awal bulan, minggu, atau jam. Kunci bikin laporan penjualan per periode yang rapi.