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, formatYYYY-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:
| Kolom | Ketik |
|---|---|
customers.signed_up_on | DATE |
orders.ordered_at | TIMESTAMP |
orders.shipped_at | TIMESTAMP (bisa NULL) |
EKSTRAK — membaca suatu bagian
EXTRACT(part FROM date) mengekstrak nomor:
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:
-- 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:
SELECT id,
shipped_at - ordered_at AS wait_time
FROM orders
WHERE shipped_at IS NOT NULL;Perbandingan dengan literal INTERVAL:
WHERE shipped_at - ordered_at > INTERVAL '1 day'Menambahkan hari ke tanggal:
SELECT signed_up_on + INTERVAL '30 days' AS trial_expiration
FROM customers;Cobalah
Hitung berapa banyak pesanan yang dilakukan per tahun. Dua kolom: tahun (bilangan bulat) dan jumlah_pesanan. Urutan berdasarkan tahun naik.
Tunjukkan petunjuk
EXTRACT(YEAR FROM order_at) mengembalikan NUMERIK: masukkan ke int dengan ::int agar mudah dibaca.
Solusi tersedia setelah 3 upaya
Tinjau latihan
Untuk setiap bulan tahun 2024, tampilkan hari pertama bulan tersebut (kolom bulan, jenis tanggal) dan jumlah pesanan. Pesan berdasarkan bulan.
Tunjukkan petunjuk
DATE_TRUNC('bulan', pesanan_at) mengembalikan hari pertama setiap bulan sebagai stempel waktu; ::date mengubahnya menjadi tanggal.
Solusi tersedia setelah 3 upaya