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.
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
Composite Index di SQL: Cara Kerja dan Urutan Kolom
Composite index itu index atas beberapa kolom sekaligus. Urutan kolomnya nentuin query mana yang kebantu, lewat aturan leftmost prefix.
Menghitung Stickiness (DAU/MAU) di SQL
Stickiness ngukur seberapa sering user balik lagi. Ini cara hitung DAU, MAU, dan rasio stickiness pakai SQL, plus contoh aplikasi UMKM.
Menghitung DAU dan MAU dengan SQL
DAU dan MAU dua metrik wajib buat produk digital. Ini cara hitungnya pakai SQL, lengkap query DISTINCT, per bulan, sampai rasio stickiness.