TL;DR
Date functions di SQL itu buat manipulasi data tanggal dan waktu. Yang paling sering dipake: CURRENT_DATE, EXTRACT, DATE_TRUNC, DATE_ADD/SUB, DATEDIFF, dan DATE_FORMAT. Penting banget buat time-series analysis dan reporting.
Kenapa Date Functions Penting Banget?
Sebagai Data Analyst, kamu pasti sering banget deal dengan data tanggal dan waktu. Laporan bulanan? Umur customer? Trend mingguan? Semuanya butuh date functions.
Masalahnya, date handling di SQL itu bisa tricky. Format tanggal beda-beda, timezone bikin pusing, dan tiap database punya fungsi yang agak berbeda.
Contoh-contoh di sini pake format Indonesia dan timezone WIB, jadi bisa langsung kamu pake buat kerjaan.
Apa yang Akan Kamu Pelajari
- [ ] Tipe data DATE, DATETIME, TIMESTAMP
- [ ] Fungsi untuk mendapatkan tanggal/waktu saat ini
- [ ] EXTRACT: Ambil bagian dari tanggal
- [ ] DATE_TRUNC: Potong tanggal ke periode tertentu
- [ ] DATE_ADD dan DATE_SUB
- [ ] Menghitung selisih tanggal (DATEDIFF)
- [ ] Formatting tanggal
- [ ] Konversi string ke date
- [ ] Timezone handling
- [ ] Use cases untuk time-series analysis
Tipe Data Tanggal di SQL
Sebelum masuk ke fungsi-fungsinya, kamu perlu tau dulu tipe data tanggal yang ada di SQL.
DATE
Cuma nyimpen tanggal (tahun, bulan, hari). Ga ada informasi waktu.
-- Format: YYYY-MM-DD
-- Contoh: 2024-12-23
TIME
Cuma nyimpen waktu (jam, menit, detik). Ga ada informasi tanggal.
-- Format: HH:MM:SS
-- Contoh: 14:30:45
DATETIME / TIMESTAMP
Nyimpen tanggal DAN waktu sekaligus.
-- Format: YYYY-MM-DD HH:MM:SS
-- Contoh: 2024-12-23 14:30:45
TIMESTAMP WITH TIME ZONE
Sama kayak TIMESTAMP, tapi include informasi timezone.
-- Format: YYYY-MM-DD HH:MM:SS+TZ
-- Contoh: 2024-12-23 14:30:45+07 (WIB)
Dataset yang Akan Kita Pakai
Buat tutorial ini, kita pakai dataset transaksi e-commerce Indonesia.
Tabel: transaksi
| id | customer_id | tanggal_order | tanggal_kirim | tanggal_selesai | total |
|---|---|---|---|---|---|
| 1 | 101 | 2024-01-15 09:30:00 | 2024-01-16 14:00:00 | 2024-01-18 10:15:00 | 500000 |
| 2 | 102 | 2024-01-20 14:45:00 | 2024-01-21 09:30:00 | 2024-01-23 16:00:00 | 750000 |
| 3 | 101 | 2024-02-05 11:00:00 | 2024-02-06 10:00:00 | 2024-02-08 09:45:00 | 320000 |
| 4 | 103 | 2024-02-14 08:15:00 | 2024-02-15 15:30:00 | 2024-02-17 11:00:00 | 1200000 |
| 5 | 102 | 2024-03-01 16:20:00 | 2024-03-02 11:45:00 | 2024-03-04 14:30:00 | 450000 |
| 6 | 104 | 2024-03-10 10:00:00 | 2024-03-11 09:00:00 | 2024-03-13 17:00:00 | 890000 |
| 7 | 101 | 2024-03-22 13:30:00 | 2024-03-23 16:15:00 | 2024-03-26 10:00:00 | 670000 |
Tabel: customers
| customer_id | nama | tanggal_lahir | tanggal_daftar | kota |
|---|---|---|---|---|
| 101 | Budi Santoso | 1990-05-15 | 2022-01-10 08:30:00 | Jakarta |
| 102 | Siti Rahayu | 1995-08-22 | 2023-03-20 14:15:00 | Bandung |
| 103 | Andi Wijaya | 1988-12-03 | 2021-11-05 10:00:00 | Surabaya |
| 104 | Dewi Lestari | 1992-02-28 | 2024-01-15 09:45:00 | Jakarta |
Fungsi untuk Mendapatkan Tanggal/Waktu Saat Ini
CURRENT_DATE
Dapetin tanggal hari ini (tanpa waktu).
SELECT CURRENT_DATE AS hari_ini;
Hasil:
| hari_ini |
|---|
| 2024-12-23 |
CURRENT_TIME
Dapetin waktu saat ini (tanpa tanggal).
SELECT CURRENT_TIME AS waktu_sekarang;
Hasil:
| waktu_sekarang |
|---|
| 14:30:45 |
CURRENT_TIMESTAMP / NOW()
Dapetin tanggal DAN waktu saat ini.
SELECT
CURRENT_TIMESTAMP AS timestamp_now,
NOW() AS now_function; -- PostgreSQL, MySQL
Hasil:
| timestamp_now | now_function |
|---|---|
| 2024-12-23 14:30:45 | 2024-12-23 14:30:45 |
Contoh Penggunaan Praktis
Filter transaksi hari ini:
SELECT *
FROM transaksi
WHERE DATE(tanggal_order) = CURRENT_DATE;
Filter transaksi 7 hari terakhir:
SELECT *
FROM transaksi
WHERE tanggal_order >= CURRENT_DATE - INTERVAL '7 days';
EXTRACT: Ambil Bagian dari Tanggal
EXTRACT itu fungsi buat ngambil bagian tertentu dari tanggal. Super useful!
Sintaks
EXTRACT(part FROM date_column)
Bagian yang Bisa Di-extract
SELECT
tanggal_order,
EXTRACT(YEAR FROM tanggal_order) AS tahun,
EXTRACT(MONTH FROM tanggal_order) AS bulan,
EXTRACT(DAY FROM tanggal_order) AS hari,
EXTRACT(HOUR FROM tanggal_order) AS jam,
EXTRACT(MINUTE FROM tanggal_order) AS menit,
EXTRACT(SECOND FROM tanggal_order) AS detik,
EXTRACT(DOW FROM tanggal_order) AS hari_minggu, -- 0=Sunday, 6=Saturday
EXTRACT(DOY FROM tanggal_order) AS hari_ke, -- Day of year (1-366)
EXTRACT(WEEK FROM tanggal_order) AS minggu_ke, -- Week of year
EXTRACT(QUARTER FROM tanggal_order) AS kuartal
FROM transaksi
LIMIT 3;
Hasil:
| tanggal_order | tahun | bulan | hari | jam | menit | detik | hari_minggu | hari_ke | minggu_ke | kuartal |
|---|---|---|---|---|---|---|---|---|---|---|
| 2024-01-15 09:30:00 | 2024 | 1 | 15 | 9 | 30 | 0 | 1 | 15 | 3 | 1 |
| 2024-01-20 14:45:00 | 2024 | 1 | 20 | 14 | 45 | 0 | 6 | 20 | 3 | 1 |
| 2024-02-05 11:00:00 | 2024 | 2 | 5 | 11 | 0 | 0 | 1 | 36 | 6 | 1 |
Contoh: Total Transaksi per Bulan
SELECT
EXTRACT(YEAR FROM tanggal_order) AS tahun,
EXTRACT(MONTH FROM tanggal_order) AS bulan,
COUNT(*) AS jumlah_transaksi,
SUM(total) AS total_revenue
FROM transaksi
GROUP BY
EXTRACT(YEAR FROM tanggal_order),
EXTRACT(MONTH FROM tanggal_order)
ORDER BY tahun, bulan;
Hasil:
| tahun | bulan | jumlah_transaksi | total_revenue |
|---|---|---|---|
| 2024 | 1 | 2 | 1250000 |
| 2024 | 2 | 2 | 1520000 |
| 2024 | 3 | 3 | 2010000 |
Contoh: Analisis Hari dalam Seminggu
SELECT
CASE EXTRACT(DOW FROM tanggal_order)
WHEN 0 THEN 'Minggu'
WHEN 1 THEN 'Senin'
WHEN 2 THEN 'Selasa'
WHEN 3 THEN 'Rabu'
WHEN 4 THEN 'Kamis'
WHEN 5 THEN 'Jumat'
WHEN 6 THEN 'Sabtu'
END AS hari,
COUNT(*) AS jumlah_order
FROM transaksi
GROUP BY EXTRACT(DOW FROM tanggal_order)
ORDER BY EXTRACT(DOW FROM tanggal_order);
Dari sini kamu bisa tau hari apa yang paling banyak order. Berguna buat planning promo!
DATE_TRUNC: Potong Tanggal ke Periode Tertentu
DATE_TRUNC itu kayak "membulatkan" tanggal ke awal periode tertentu. Berguna banget buat grouping.
Sintaks (PostgreSQL)
DATE_TRUNC('period', date_column)
Contoh Penggunaan
SELECT
tanggal_order,
DATE_TRUNC('year', tanggal_order) AS awal_tahun,
DATE_TRUNC('quarter', tanggal_order) AS awal_kuartal,
DATE_TRUNC('month', tanggal_order) AS awal_bulan,
DATE_TRUNC('week', tanggal_order) AS awal_minggu,
DATE_TRUNC('day', tanggal_order) AS awal_hari,
DATE_TRUNC('hour', tanggal_order) AS awal_jam
FROM transaksi
LIMIT 3;
Hasil:
| tanggal_order | awal_tahun | awal_kuartal | awal_bulan | awal_minggu | awal_hari | awal_jam |
|---|---|---|---|---|---|---|
| 2024-01-15 09:30:00 | 2024-01-01 | 2024-01-01 | 2024-01-01 | 2024-01-15 | 2024-01-15 | 2024-01-15 09:00:00 |
| 2024-01-20 14:45:00 | 2024-01-01 | 2024-01-01 | 2024-01-01 | 2024-01-15 | 2024-01-20 | 2024-01-20 14:00:00 |
| 2024-02-05 11:00:00 | 2024-01-01 | 2024-01-01 | 2024-02-01 | 2024-02-05 | 2024-02-05 | 2024-02-05 11:00:00 |
Grouping dengan DATE_TRUNC
SELECT
DATE_TRUNC('month', tanggal_order) AS bulan,
COUNT(*) AS jumlah_order,
SUM(total) AS revenue
FROM transaksi
GROUP BY DATE_TRUNC('month', tanggal_order)
ORDER BY bulan;
Lebih clean daripada pake EXTRACT untuk year dan month terpisah.
DATE_ADD dan DATE_SUB
Fungsi buat nambah atau ngurangin waktu dari tanggal.
PostgreSQL / Standard SQL
SELECT
tanggal_order,
tanggal_order + INTERVAL '7 days' AS seminggu_kemudian,
tanggal_order - INTERVAL '1 month' AS sebulan_sebelum,
tanggal_order + INTERVAL '2 hours' AS dua_jam_kemudian
FROM transaksi
LIMIT 3;
MySQL
SELECT
tanggal_order,
DATE_ADD(tanggal_order, INTERVAL 7 DAY) AS seminggu_kemudian,
DATE_SUB(tanggal_order, INTERVAL 1 MONTH) AS sebulan_sebelum,
DATE_ADD(tanggal_order, INTERVAL 2 HOUR) AS dua_jam_kemudian
FROM transaksi
LIMIT 3;
Contoh Praktis: Estimasi Tanggal Pengiriman
SELECT
id,
tanggal_order,
tanggal_order + INTERVAL '1 day' AS estimasi_kirim,
tanggal_order + INTERVAL '3 days' AS estimasi_sampai
FROM transaksi;
Contoh: Filter Transaksi 30 Hari Terakhir
SELECT *
FROM transaksi
WHERE tanggal_order >= CURRENT_DATE - INTERVAL '30 days';
DATEDIFF: Menghitung Selisih Tanggal
PostgreSQL
Di PostgreSQL, kamu bisa langsung kurangin tanggal.
SELECT
id,
tanggal_order,
tanggal_selesai,
tanggal_selesai - tanggal_order AS selisih_interval,
EXTRACT(DAY FROM (tanggal_selesai - tanggal_order)) AS selisih_hari,
-- Atau pake DATE biar dapet integer
DATE(tanggal_selesai) - DATE(tanggal_order) AS selisih_hari_int
FROM transaksi;
Hasil:
| id | tanggal_order | tanggal_selesai | selisih_interval | selisih_hari | selisih_hari_int |
|---|---|---|---|---|---|
| 1 | 2024-01-15 09:30:00 | 2024-01-18 10:15:00 | 3 days 00:45:00 | 3 | 3 |
| 2 | 2024-01-20 14:45:00 | 2024-01-23 16:00:00 | 3 days 01:15:00 | 3 | 3 |
MySQL
MySQL punya fungsi DATEDIFF khusus.
SELECT
id,
tanggal_order,
tanggal_selesai,
DATEDIFF(tanggal_selesai, tanggal_order) AS selisih_hari
FROM transaksi;
Contoh: Hitung Umur Customer
SELECT
nama,
tanggal_lahir,
EXTRACT(YEAR FROM AGE(CURRENT_DATE, tanggal_lahir)) AS umur
FROM customers;
Hasil:
| nama | tanggal_lahir | umur |
|---|---|---|
| Budi Santoso | 1990-05-15 | 34 |
| Siti Rahayu | 1995-08-22 | 29 |
| Andi Wijaya | 1988-12-03 | 36 |
| Dewi Lestari | 1992-02-28 | 32 |
Contoh: Rata-rata Waktu Pengiriman
SELECT
AVG(DATE(tanggal_selesai) - DATE(tanggal_order)) AS avg_delivery_days,
MIN(DATE(tanggal_selesai) - DATE(tanggal_order)) AS min_delivery_days,
MAX(DATE(tanggal_selesai) - DATE(tanggal_order)) AS max_delivery_days
FROM transaksi;
Formatting Tanggal
TO_CHAR (PostgreSQL)
SELECT
tanggal_order,
TO_CHAR(tanggal_order, 'DD-MM-YYYY') AS format_indonesia,
TO_CHAR(tanggal_order, 'DD Mon YYYY') AS format_singkat,
TO_CHAR(tanggal_order, 'Day, DD Month YYYY') AS format_lengkap,
TO_CHAR(tanggal_order, 'HH24:MI:SS') AS waktu_24jam,
TO_CHAR(tanggal_order, 'HH12:MI AM') AS waktu_12jam
FROM transaksi
LIMIT 3;
Hasil:
| tanggal_order | format_indonesia | format_singkat | format_lengkap | waktu_24jam | waktu_12jam |
|---|---|---|---|---|---|
| 2024-01-15 09:30:00 | 15-01-2024 | 15 Jan 2024 | Monday, 15 January 2024 | 09:30:00 | 09:30 AM |
DATE_FORMAT (MySQL)
SELECT
tanggal_order,
DATE_FORMAT(tanggal_order, '%d-%m-%Y') AS format_indonesia,
DATE_FORMAT(tanggal_order, '%d %b %Y') AS format_singkat,
DATE_FORMAT(tanggal_order, '%W, %d %M %Y') AS format_lengkap
FROM transaksi
LIMIT 3;
Format Codes yang Sering Dipake
| Code | Deskripsi | Contoh |
|---|---|---|
| YYYY / %Y | Tahun 4 digit | 2024 |
| YY / %y | Tahun 2 digit | 24 |
| MM / %m | Bulan 2 digit | 01 |
| Mon / %b | Bulan singkat | Jan |
| Month / %M | Bulan lengkap | January |
| DD / %d | Hari 2 digit | 15 |
| Day / %W | Nama hari | Monday |
| HH24 / %H | Jam 24 format | 14 |
| HH12 / %h | Jam 12 format | 02 |
| MI / %i | Menit | 30 |
| SS / %s | Detik | 45 |
Konversi String ke Date
Kadang data tanggal dateng dalam bentuk string. Kamu perlu convert dulu.
TO_DATE / TO_TIMESTAMP (PostgreSQL)
SELECT
TO_DATE('15-01-2024', 'DD-MM-YYYY') AS dari_string,
TO_TIMESTAMP('15-01-2024 09:30:00', 'DD-MM-YYYY HH24:MI:SS') AS dengan_waktu;
STR_TO_DATE (MySQL)
SELECT
STR_TO_DATE('15-01-2024', '%d-%m-%Y') AS dari_string,
STR_TO_DATE('15-01-2024 09:30:00', '%d-%m-%Y %H:%i:%s') AS dengan_waktu;
CAST (Standard SQL)
SELECT
CAST('2024-01-15' AS DATE) AS tanggal,
CAST('2024-01-15 09:30:00' AS TIMESTAMP) AS timestamp;
Timezone Handling
Ini yang sering bikin pusing. Indonesia punya 3 timezone: WIB, WITA, WIT.
Konversi Timezone (PostgreSQL)
SELECT
tanggal_order,
tanggal_order AT TIME ZONE 'UTC' AS utc,
tanggal_order AT TIME ZONE 'Asia/Jakarta' AS wib,
tanggal_order AT TIME ZONE 'Asia/Makassar' AS wita,
tanggal_order AT TIME ZONE 'Asia/Jayapura' AS wit
FROM transaksi
LIMIT 2;
Set Timezone Default
-- PostgreSQL
SET timezone = 'Asia/Jakarta';
-- MySQL
SET time_zone = '+07:00';
Contoh Praktis: Konversi dari UTC ke WIB
Kalau data kamu disimpan dalam UTC (common practice), konversi ke WIB buat reporting:
SELECT
id,
tanggal_order AS utc_time,
tanggal_order AT TIME ZONE 'UTC' AT TIME ZONE 'Asia/Jakarta' AS wib_time
FROM transaksi;
Use Cases untuk Time-Series Analysis
1. Trend Harian
SELECT
DATE(tanggal_order) AS tanggal,
COUNT(*) AS jumlah_order,
SUM(total) AS revenue
FROM transaksi
GROUP BY DATE(tanggal_order)
ORDER BY tanggal;
2. Perbandingan Week over Week
WITH weekly_data AS (
SELECT
DATE_TRUNC('week', tanggal_order) AS minggu,
SUM(total) AS revenue
FROM transaksi
GROUP BY DATE_TRUNC('week', tanggal_order)
)
SELECT
minggu,
revenue,
LAG(revenue) OVER (ORDER BY minggu) AS revenue_minggu_lalu,
revenue - LAG(revenue) OVER (ORDER BY minggu) AS selisih
FROM weekly_data
ORDER BY minggu;
3. Month to Date (MTD)
SELECT
SUM(total) AS mtd_revenue
FROM transaksi
WHERE tanggal_order >= DATE_TRUNC('month', CURRENT_DATE)
AND tanggal_order < CURRENT_DATE + INTERVAL '1 day';
4. Year over Year Comparison
SELECT
EXTRACT(MONTH FROM tanggal_order) AS bulan,
SUM(CASE WHEN EXTRACT(YEAR FROM tanggal_order) = 2024 THEN total ELSE 0 END) AS revenue_2024,
SUM(CASE WHEN EXTRACT(YEAR FROM tanggal_order) = 2023 THEN total ELSE 0 END) AS revenue_2023
FROM transaksi
WHERE EXTRACT(YEAR FROM tanggal_order) IN (2023, 2024)
GROUP BY EXTRACT(MONTH FROM tanggal_order)
ORDER BY bulan;
5. Cohort by First Order Date
WITH first_order AS (
SELECT
customer_id,
MIN(DATE_TRUNC('month', tanggal_order)) AS cohort_month
FROM transaksi
GROUP BY customer_id
)
SELECT
cohort_month,
COUNT(*) AS new_customers
FROM first_order
GROUP BY cohort_month
ORDER BY cohort_month;
Common Mistakes yang Harus Dihindari
Mistake 1: Bandingin DATE dengan TIMESTAMP
-- POTENSI MASALAH
SELECT * FROM transaksi
WHERE tanggal_order = '2024-01-15'; -- Ini '2024-01-15 00:00:00'
-- LEBIH AMAN
SELECT * FROM transaksi
WHERE DATE(tanggal_order) = '2024-01-15';
-- Atau pake range
SELECT * FROM transaksi
WHERE tanggal_order >= '2024-01-15'
AND tanggal_order < '2024-01-16';
Mistake 2: Lupa Timezone
-- DATA BISA SALAH kalau timezone ga konsisten
SELECT * FROM transaksi
WHERE tanggal_order >= '2024-01-15';
-- LEBIH BAIK, eksplisit timezone
SELECT * FROM transaksi
WHERE tanggal_order >= '2024-01-15 00:00:00+07';
Mistake 3: Format String yang Salah
-- ERROR
SELECT TO_DATE('15/01/2024', 'DD-MM-YYYY'); -- Format ga match!
-- BENAR
SELECT TO_DATE('15/01/2024', 'DD/MM/YYYY');
Tips dan Best Practices
1. Simpan dalam UTC
Best practice: simpan semua timestamp dalam UTC, konversi ke local timezone saat display.
2. Pake DATE_TRUNC untuk Grouping
Lebih clean daripada EXTRACT year dan month terpisah.
3. Index Kolom Tanggal
Kalau sering filter berdasarkan tanggal, pastikan ada index.
4. Konsisten dengan Format
Pilih satu format dan stick dengan itu di seluruh aplikasi.
5. Handle NULL
SELECT COALESCE(tanggal_selesai, CURRENT_TIMESTAMP) AS tanggal_final
FROM transaksi;
Latihan
Coba kerjain query ini:
Soal: Hitung rata-rata waktu dari order sampai selesai (dalam hari dan jam) per bulan. Hasil diurutkan dari yang tercepat.
Klik untuk lihat hint
1. Hitung selisih tanggal_selesai - tanggal_order 2. Group by bulan (pake DATE_TRUNC) 3. Hitung average 4. Format hasilnya biar readableKlik untuk lihat solusi
SELECT
DATE_TRUNC('month', tanggal_order) AS bulan,
COUNT(*) AS total_order,
ROUND(AVG(EXTRACT(EPOCH FROM (tanggal_selesai - tanggal_order)) / 86400), 2) AS avg_hari,
ROUND(AVG(EXTRACT(EPOCH FROM (tanggal_selesai - tanggal_order)) / 3600), 2) AS avg_jam
FROM transaksi
GROUP BY DATE_TRUNC('month', tanggal_order)
ORDER BY avg_hari;
**Hasil:**
| bulan | total_order | avg_hari | avg_jam |
|-------|-------------|----------|---------|
| 2024-02-01 | 2 | 2.54 | 60.88 |
| 2024-01-01 | 2 | 3.04 | 73.00 |
| 2024-03-01 | 3 | 3.19 | 76.53 |
FAQ
Apa bedanya DATE, DATETIME, dan TIMESTAMP?
DATE cuma nyimpen tanggal, contohnya 2024-12-23. DATETIME nyimpen tanggal plus waktu sekaligus. TIMESTAMP mirip DATETIME, tapi ada varian TIMESTAMP WITH TIME ZONE yang nyimpen info timezone juga. Buat data transaksi, pake TIMESTAMP biar jam kejadiannya kerekam. Kalau cuma butuh tanggal lahir atau tanggal libur, DATE udah cukup kok.
Kapan pake EXTRACT dan kapan pake DATE_TRUNC?
EXTRACT buat ngambil satu bagian dari tanggal — bulan doang atau tahun doang. DATE_TRUNC buat "membulatkan" tanggal ke awal periode, contohnya 2024-01-15 jadi 2024-01-01. Buat grouping laporan bulanan, DATE_TRUNC lebih clean soalnya hasilnya tetap tanggal yang bisa di-sort langsung. EXTRACT lebih cocok buat analisis kayak jumlah order per hari dalam seminggu.
Gimana cara handle timezone WIB di SQL?
Best practice-nya simpan semua timestamp dalam UTC, lalu konversi ke WIB pas bikin report. Di PostgreSQL pake AT TIME ZONE 'Asia/Jakarta', di MySQL set time_zone = '+07:00'. Indonesia punya 3 timezone: WIB, WITA, WIT. Kalau user kamu tersebar, konversi di layer display aja biar datanya konsisten.
DATEDIFF nggak jalan di PostgreSQL, gimana dong?
PostgreSQL emang nggak punya fungsi DATEDIFF kayak MySQL. Gantinya, kurangin langsung dua tanggalnya: DATE(tanggal_selesai) - DATE(tanggal_order) hasilnya integer jumlah hari. Kalau butuh selisih dalam jam atau menit, pake EXTRACT(EPOCH FROM ...) terus bagi 3600 buat jam. Konsepnya sama, cuma syntax-nya beda dikit.
Kesimpulan
Date functions itu skill wajib buat Data Analyst. Inget poin-poin ini:
- Pahami perbedaan DATE, DATETIME, TIMESTAMP
- EXTRACT buat ambil bagian dari tanggal
- DATE_TRUNC buat grouping by period
- INTERVAL buat tambah/kurang waktu
- Handle timezone dengan hati-hati
- Format tanggal sesuai kebutuhan audience (Indonesia: DD-MM-YYYY)
Latihan yang banyak ya, karena setiap database punya sedikit perbedaan syntax. Yang penting kamu paham konsepnya, tinggal adjust syntax-nya aja.
Happy querying!
Selanjutnya
Kalau kamu udah paham date functions, next step-nya:
- Cohort Analysis - analisis retention berbasis waktu
- Window Functions - analisis time-series yang lebih advanced
- GROUP BY dan HAVING - agregasi data per periode
Mau praktek langsung? Mulai latihan SQL gratis
Latihan interaktif, langsung di browser.
Artikel Terkait
Membuat Dashboard Metrics dengan SQL: KPI yang Wajib Ditrack
Panduan lengkap query SQL untuk membangun dashboard metrics, dari revenue metrics sampai retention analysis.
Funnel Analysis dengan SQL: Mengukur Conversion Rate Step-by-Step
Pelajari cara bikin funnel analysis untuk mengukur conversion rate di setiap step. Lengkap dengan template query dan cara present ke stakeholder.
SQL untuk A/B Testing Analysis: Panduan Praktis
Pelajari cara menganalisis A/B test dengan SQL. Dari hitung conversion rate sampai statistical significance dengan contoh e-commerce Indonesia.