0Pricing
Coding Interview Prep · Pelajaran

Memotong dan Mengelompokkan Tanggal

Mengelompokkan berdasarkan minggu, bulan, dan kuartal dengan DATE_TRUNC dan padanannya.

Memotong dan Mengelompokkan Tanggal adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Mengapa Pengelompokan Tanggal Sering Ditanyakan

"Tampilkan pendapatan per minggu" atau "pengguna aktif per bulan" adalah pertanyaan yang sangat umum dalam wawancara analis. Keterampilan yang diuji adalah mengubah stempel waktu yang presisi menjadi kelompok yang lebih kasar agar baris-baris dapat dikelompokkan bersama.

Kesalahan yang sering dibuat pemula adalah hanya mengambil angka bulan, sehingga bulan yang sama dari tahun berbeda tercampur. Jawaban profesionalnya adalah pemotongan: memetakan setiap stempel waktu ke awal periodenya.

  • Kelompok minggu, bulan, kuartal, dan tahun
  • DATE_TRUNC dan padanannya dalam berbagai dialek
  • Pengelompokan yang benar agar grafik tersusun dengan tepat

DATE_TRUNC: Alat Utama

Di PostgreSQL, DATE_TRUNC(unit, ts) mengosongkan semua bagian yang lebih kecil daripada unit tersebut. Pemotongan ke 'month' mengubah stempel waktu apa pun di bulan Maret menjadi 2024-03-01 00:00:00.

Nilai hasilnya tetap berupa stempel waktu, sehingga dapat diurutkan secara kronologis dan dikelompokkan dengan sempurna. Ini adalah fungsi tanggal yang paling berguna untuk pelaporan.

SELECT DATE_TRUNC('month', TIMESTAMP '2024-03-17 14:30:00');
-- 2024-03-01 00:00:00

Mengelompokkan Pendapatan per Bulan

Ini adalah contoh penerapan utama. Potong stempel waktu ke bulan, lalu kelompokkan dan jumlahkan. Karena kelompok tersebut menyertakan tahun, Januari 2023 dan Januari 2024 tetap terpisah.

Mengurutkan berdasarkan nilai yang sudah dipotong menghasilkan rangkaian waktu yang rapi dan siap digunakan untuk grafik.

SELECT
  DATE_TRUNC('month', order_ts) AS month,
  SUM(amount)                   AS revenue
FROM orders
GROUP BY 1
ORDER BY 1;

EXTRACT vs DATE_TRUNC

Pewawancara sering menguji perbedaan ini secara langsung. Keduanya mengambil informasi periode, tetapi menjawab pertanyaan yang berbeda.

  • EXTRACT(MONTH FROM ts) mengembalikan angka 3 untuk setiap bulan Maret di semua tahun, sehingga berguna untuk melihat pola musiman.
  • DATE_TRUNC('month', ts) mengembalikan awal bulan tertentu, sehingga tahun tetap dibedakan dan hasilnya berguna untuk rangkaian waktu.

Jika Anda mengelompokkan berdasarkan EXTRACT(MONTH ...) untuk grafik tren bulanan, Anda akan tanpa sadar mencampurkan tahun-tahun yang berbeda.

-- Seasonality: which month is busiest on average?
SELECT EXTRACT(MONTH FROM order_ts) AS month_num, COUNT(*)
FROM orders GROUP BY 1 ORDER BY 1;

-- Time series: month-by-month trend (years kept separate)
SELECT DATE_TRUNC('month', order_ts) AS month, COUNT(*)
FROM orders GROUP BY 1 ORDER BY 1;

Kelompok Minggu dan Pertanyaan tentang Hari Senin

Pengelompokan mingguan menyembunyikan satu hal kecil yang sering disukai pewawancara: kapan minggu dimulai? DATE_TRUNC('week', ts) di PostgreSQL selalu membulatkan ke Senin (minggu ISO).

Jika bisnis menginginkan minggu yang dimulai pada hari Minggu, Anda harus menggesernya. Cara yang umum adalah menggeser tanggal satu hari ke belakang, melakukan pemotongan, lalu menggesernya satu hari ke depan.

-- ISO week (Monday start)
SELECT DATE_TRUNC('week', order_ts) AS iso_week FROM orders;

-- Sunday-start week
SELECT DATE_TRUNC('week', order_ts + INTERVAL '1 day') - INTERVAL '1 day'
  AS sunday_week
FROM orders;

Kelompok Kuartal

Pelaporan per kuartal umum dalam peran yang berkaitan dengan keuangan. DATE_TRUNC('quarter', ts) memetakan stempel waktu apa pun ke hari pertama kuartalnya: 1 Januari, 1 April, 1 Juli, atau 1 Oktober.

Untuk memberi label kuartal sebagai angka, gabungkan EXTRACT(QUARTER ...) dengan tahun.

SELECT
  DATE_TRUNC('quarter', order_ts)                  AS quarter_start,
  EXTRACT(YEAR FROM order_ts) || '-Q'
    || EXTRACT(QUARTER FROM order_ts)              AS quarter_label,
  SUM(amount)                                      AS revenue
FROM orders
GROUP BY 1, 2
ORDER BY 1;

MySQL Tidak Memiliki DATE_TRUNC

Pertanyaan lintas dialek yang sering muncul: "MySQL tidak memiliki DATE_TRUNC, bagaimana Anda mengelompokkan data per bulan?" Jawaban yang dapat digunakan lintas sistem adalah memformat tanggal hingga tingkat ketelitian yang diinginkan.

  • DATE_FORMAT(ts, '%Y-%m-01') menghasilkan awal bulan sebagai teks/tanggal.
  • DATE_FORMAT(ts, '%Y-%m') menghasilkan kunci teks yang dapat diurutkan, seperti 2024-03.

Untuk minggu, MySQL menyediakan YEARWEEK() dengan argumen mode yang mengatur awal minggu.

-- MySQL month bucket
SELECT DATE_FORMAT(order_ts, '%Y-%m-01') AS month, SUM(amount)
FROM orders
GROUP BY 1
ORDER BY 1;

Pengelompokan di SQL Server

SQL Server dulu tidak memiliki fungsi pemotongan langsung, sehingga kandidat menggunakan DATEFROMPARTS atau pola DATEADD/DATEDIFF. Versi modern (2022+) menambahkan DATETRUNC.

Pola klasik "hitung unit sejak titik awal waktu, lalu tambahkan kembali" bekerja pada semua versi dan layak Anda kuasai.

-- Portable SQL Server month truncation
SELECT DATEADD(month, DATEDIFF(month, 0, order_ts), 0) AS month_start
FROM orders;

-- SQL Server 2022+
SELECT DATETRUNC(month, order_ts) AS month_start FROM orders;

Mengisi Kekosongan dalam Rangkaian Waktu

Pemotongan saja menghilangkan periode yang tidak memiliki baris: bulan tanpa pesanan tidak akan muncul sama sekali. Pewawancara menguji apakah Anda menyadari hal ini.

Solusinya adalah membuat rangkaian periode yang lengkap lalu menggabungkan data ke rangkaian tersebut dengan LEFT JOIN. Di PostgreSQL, generate_series dapat membuat rangkaian tersebut.

SELECT
  cal.month,
  COALESCE(SUM(o.amount), 0) AS revenue
FROM generate_series(DATE '2024-01-01', DATE '2024-12-01',
                      INTERVAL '1 month') AS cal(month)
LEFT JOIN orders o
  ON DATE_TRUNC('month', o.order_ts) = cal.month
GROUP BY cal.month
ORDER BY cal.month;

Contoh Lebih Mendalam: Pengguna Aktif per Minggu

Gabungkan pengelompokan dengan penghitungan nilai berbeda. "Pengguna aktif mingguan" berarti menghitung pengguna berbeda untuk setiap kelompok minggu, sebuah kebutuhan nyata dalam analitik produk.

Potong stempel waktu peristiwa ke minggu, lalu gunakan COUNT(DISTINCT user_id). Menyebutkan bahwa Anda akan menggabungkan rangkaian minggu untuk menampilkan minggu tanpa aktivitas dapat memberi nilai tambahan.

SELECT
  DATE_TRUNC('week', event_ts) AS week,
  COUNT(DISTINCT user_id)      AS wau
FROM events
GROUP BY 1
ORDER BY 1;

Pengelompokan pada Kolom Berindeks

Satu catatan kinerja yang perlu disampaikan: membungkus kolom tanggal dengan DATE_TRUNC di dalam klausa WHERE dapat mencegah perencana kueri menggunakan indeks pada kolom tersebut.

Hal itu tidak masalah dalam GROUP BY, tetapi untuk penyaringan, bandingkan kolom asli dengan batas yang sudah dihitung. Kita telah membahas pola interval setengah terbuka ini sebelumnya; pola tersebut juga berlaku di sini.

-- Avoid in WHERE: DATE_TRUNC('month', order_ts) = '2024-03-01'
-- Prefer:
SELECT * FROM orders
WHERE order_ts >= DATE '2024-03-01'
  AND order_ts <  DATE '2024-04-01';

Pemeriksaan Singkat

Pilih alat yang tepat untuk grafik tren bulanan yang memisahkan tahun.

Ringkasan: Memotong dan Mengelompokkan Tanggal

Hal yang perlu diingat:

  • DATE_TRUNC(unit, ts) memetakan stempel waktu ke awal suatu periode dan membedakan tahun, sehingga tepat untuk rangkaian waktu.
  • EXTRACT mengembalikan angka saja, yang baik untuk pola musiman tetapi mencampurkan tahun.
  • Minggu di PostgreSQL dimulai pada Senin; lakukan penggeseran jika Anda memerlukan hari Minggu.
  • MySQL menggunakan DATE_FORMAT; SQL Server versi lama menggunakan pola DATEADD(DATEDIFF(...)); versi 2022+ memiliki DATETRUNC.
  • Gunakan rangkaian tanggal + LEFT JOIN yang dibuat secara otomatis untuk menampilkan periode kosong, dan jangan gunakan DATE_TRUNC di dalam WHERE agar indeks tetap dapat digunakan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Memotong dan Mengelompokkan Tanggal” gratis?

Ya — teks lengkap “Memotong dan Mengelompokkan Tanggal” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Coding Interview Prep, upgrade ke CoddyKit PRO. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Memotong dan Mengelompokkan Tanggal”?

Mengelompokkan berdasarkan minggu, bulan, dan kuartal dengan DATE_TRUNC dan padanannya. Kamu berlatih Coding Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Coding Interview Prep?

Tidak diperlukan pengalaman sebelumnya. Coding Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Memotong dan Mengelompokkan Tanggal” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Coding Interview Prep ini?

Ya. Setiap pelajaran Coding Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Aritmetika Tanggal dan Interval
  2. Memotong dan Mengelompokkan Tanggal
  3. Mengurai dan Memformat String
  4. Zona Waktu dan Stempel Waktu
← Kembali ke Coding Interview Prep