Menghitung YTD, QTD, dan MTD di SQL (Panduan 2026)
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.
Apa itu YTD, QTD, dan MTD?
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.
Gimana cara ngitung YTD di SQL?
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.
Gimana cara ngitung QTD dan MTD?
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;
Gabung YTD, QTD, dan MTD dalam satu query
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.
Contoh kasus: laporan toko_berkah
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.
Kesalahan umum saat ngitung YTD
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.
FAQ
Pertanyaan yang sering muncul soal YTD, QTD, dan MTD di SQL.
Apa bedanya YTD, QTD, dan MTD?
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.
Kenapa lebih baik pakai DATE_TRUNC dibanding nulis tanggal manual?
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.
Gimana kalau databaseku MySQL yang nggak punya DATE_TRUNC?
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 nggak hitung YTD tahun lalu buat perbandingan?
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.
Apakah YTD sama dengan running total?
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.
Penutup
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.
Artikel terkait
CTE vs Subquery vs Temp Table: Mana Lebih Cepat
CTE, subquery, dan temp table sama-sama bikin hasil sementara, tapi performanya beda. Ini panduan milih yang mana buat query kamu.
Partisi Tabel di SQL untuk Data Besar
Partisi tabel memecah satu tabel besar jadi potongan kecil biar query cuma baca bagian yang relevan. Ini cara bikin dan kapan kamu butuh.
Covering Index di SQL untuk Query Lebih Cepat (2026)
Covering index bikin query cepat karena semua kolom yang dibutuhin ada di index, jadi database nggak perlu buka tabel utama.