Lompati ke konten utama
Modul 6 · Pelajaran 2 dari 422/57 dalam kursus~12 min
Pelajaran modul (2/4)

Fungsi tanggal dan stempel waktu

Tanggal dan stempel waktu ada di mana-mana: pesanan, login, acara, penagihan. Di pelajaran ini kita melihat cara mengekstraksi bagian dari tanggal (tahun, bulan…), potong menjadi perincian (bulan, minggu…), hitung interval dan perbedaan, dan membuat perbandingan antar periode.

Tipe dasar

PostgreSQL membedakan:

  • DATE — hanya tanggal, format YYYY-MM-DD;
  • TIMESTAMP — tanggal + waktu, tanpa zona waktu;
  • TIMESTAMPTZ — tanggal + waktu + zona waktu;
  • INTERVAL — titik (misalnya '3 days', '2 hours 30 minutes').

Dalam kumpulan data ecommerce kami:

KolomKetik
customers.signed_up_onDATE
orders.ordered_atTIMESTAMP
orders.shipped_atTIMESTAMP (bisa NULL)

EKSTRAK — membaca suatu bagian

EXTRACT(part FROM date) mengekstrak nomor:

SQL
SELECT EXTRACT(YEAR  FROM ordered_at) AS year,
       EXTRACT(MONTH FROM ordered_at) AS month,
       EXTRACT(DOW   FROM ordered_at) AS day_of_week  -- 0=domenica
FROM   orders;

Bagian yang paling sering digunakan: YEAR, MONTH, DAY, HOUR, MINUTE, DOW (hari minggu 0-6), DOY (hari dalam setahun).

DATE_TRUNC — pembulatan ke bawah

DATE_TRUNC('part', date) "memotong" tanggal menjadi lebih rinci. Itu benar penting untuk menggabungkan berdasarkan bulan, minggu, jam:

SQL
-- Tutti gli ordini fatti in "marzo 2025" cadono nello stesso bucket:
SELECT DATE_TRUNC('month', ordered_at) AS month,
       COUNT(*) AS order_count
FROM   orders
GROUP BY month
ORDER BY month;

Bagian yang valid: 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second'.

Agar mudah dibaca, orang sering kali menggunakan DATE saat waktu tidak diperlukan: DATE_TRUNC('month', ordered_at)::date.

Perbedaan dan interval

Mengurangi dua TIMESTAMP menghasilkan INTERVAL:

SQL
SELECT id,
       shipped_at - ordered_at AS wait_time
FROM   orders
WHERE  shipped_at IS NOT NULL;

Perbandingan dengan literal INTERVAL:

SQL
WHERE  shipped_at - ordered_at > INTERVAL '1 day'

Menambahkan hari ke tanggal:

SQL
SELECT signed_up_on + INTERVAL '30 days' AS trial_expiration
FROM   customers;

Cobalah

Latihan#sql.m6.l2.e1
Upaya: 0Memuat…

Hitung berapa banyak pesanan yang dilakukan per tahun. Dua kolom: tahun (bilangan bulat) dan jumlah_pesanan. Urutan berdasarkan tahun naik.

Memuat editor…
Tunjukkan petunjuk

EXTRACT(YEAR FROM order_at) mengembalikan NUMERIK: masukkan ke int dengan ::int agar mudah dibaca.

Solusi tersedia setelah 3 upaya

Tinjau latihan

Latihan#sql.m6.l2.e2
Upaya: 0Memuat…

Untuk setiap bulan tahun 2024, tampilkan hari pertama bulan tersebut (kolom bulan, jenis tanggal) dan jumlah pesanan. Pesan berdasarkan bulan.

Memuat editor…
Tunjukkan petunjuk

DATE_TRUNC('bulan', pesanan_at) mengembalikan hari pertama setiap bulan sebagai stempel waktu; ::date mengubahnya menjadi tanggal.

Solusi tersedia setelah 3 upaya