Soal 1Manakah yang merupakan keuntungan benar dari menyimpan tanggal sebagai string ISO seperti '2024-03-15'?
Tipe Tanggal/Waktu dan Tabel STRICT
Memakai tabel perf_sales 50.000 baris, pelajari tiga format penyimpanan tanggal (string ISO, julianday, unixepoch), agregasi berdasarkan tahun dan rentang dengan date() / strftime(), dan bagaimana tabel typed_strict menolak ketidakcocokan tipe — semua berjalan langsung di browser.
Data yang akan kita pakai — perf_sales
Tanggal disimpan baik sebagai string maupun sebagai angka, dan kamu membaca atau menghitungnya dengan fungsi seperti date() / strftime().
Di paruh pertama, kamu akan memakai kolom sale_date dari tabel penjualan perf_sales untuk memeriksa tiga format penyimpanan dan cara mengekstrak nilai; di paruh kedua, kamu akan membuat sendiri tabel STRICT untuk melihat apa yang terjadi ketika kamu memasukkan nilai yang tidak cocok dengan tipe yang dideklarasikan.
Tiga format penyimpanan tanggal — string ISO / julianday / unixepoch
Tanggal dan waktu bisa disimpan dalam tiga format utama.
| Format | Contoh nilai | Penggunaan utama |
|---|---|---|
| String ISO | '2024-03-15' (dengan waktu: '2024-03-15 12:30:00') | Mudah dibaca manusia; sorting dan pembandingan rentang bekerja dengan benar sebagai pembandingan string biasa (pilihan paling umum) |
| julianday | julianday('2024-03-15') → 2460384.5 (desimal yang menghitung hari sejak zaman kuno) | Menghitung selisih dua tanggal dalam hari |
| unixepoch | strftime('%s', ...) → 1710460800 (integer detik sejak 1970-01-01) | Perhitungan waktu level detik / interoperabilitas antar sistem |
Format apa pun yang kamu simpan, kamu bisa membacanya kembali sebagai 'YYYY-MM-DD' dengan date() atau sebagai 'YYYY-MM-DD HH:MM:SS' dengan datetime().
Kursus ini memakai string ISO secara default karena mudah dibaca manusia dan mudah dibandingkan, dan hanya mengonversi ke julianday / unixepoch saat diperlukan.
-- Tanggal yang sama dalam 3 format (contoh read-only)
SELECT '2024-03-15' AS iso_text,
julianday('2024-03-15') AS as_julianday,
strftime('%s','2024-03-15 00:00:00') AS as_unixepoch;
-- Konversi masing-masing dari 3 format kembali ke tanggal yang bisa dibaca
SELECT date(julianday('2024-03-15')) AS from_jd,
datetime(1710460800,'unixepoch') AS from_unix,
date('2024-03-15') AS from_iso;
-- Dengan string ISO, pembandingan rentang bekerja dengan benar sebagai pembandingan string biasa
SELECT '2024-03-15' BETWEEN '2024-01-01' AND '2024-12-31' AS in_2024; -- 1
Manipulasi dan agregasi tanggal dengan date() dan strftime()
date(nilai, modifier...): mengembalikan bagian tanggal sebagai'YYYY-MM-DD', dan membuat kamu bisa melakukan perhitungan tanggal dengan modifier seperti'+1 month'/'-7 days'/'start of month'strftime(format, nilai): mengekstrak sebagian tanggal sebagai string memakai format specifier seperti%Y(tahun),%m(bulan),%d(hari),%w(hari dalam minggu)- Kombinasikan
strftime('%Y', sale_date)denganGROUP BYuntuk mengagregasi berdasarkan tahun - Karena
sale_datedisimpan sebagai string ISO, kondisi rentang seperti `WHERE sale_date >= '2024-01-01'` bekerja dengan benar sebagai pembandingan string biasa
-- Manipulasi tanggal (contoh read-only)
SELECT date('2024-03-15','+1 month') AS plus_1_month, -- 2024-04-15
date('2024-03-15','start of month') AS month_start, -- 2024-03-01
strftime('%Y', '2024-03-15') AS year_part, -- 2024
strftime('%Y-%m','2024-03-15') AS year_month; -- 2024-03
-- Hitung berdasarkan tahun (string ISO, jadi ekstrak tahun dengan strftime dan GROUP BY)
SELECT strftime('%Y', sale_date) AS yr, COUNT(*) AS cnt
FROM perf_sales
GROUP BY yr
ORDER BY yr;
Tabel STRICT — memberlakukan tipe ketat
Type affinity yang kita lihat sejauh ini mengonversi string yang terlihat seperti angka secara fleksibel.
Sebaliknya, ketika kamu menambahkan STRICT di akhir definisi tabel, tabel itu menolak menyimpan nilai yang tipenya tidak cocok dengan yang dideklarasikan.
Kalau kamu mencoba memasukkan string non-angka ke kolom numerik, nilainya tidak dikonversi secara implisit — kamu mendapat error.
Pakai ini untuk tabel di mana kamu ingin menangkap kekeliruan tipe sedini mungkin.
Di tabel STRICT, tipe kolom yang diizinkan terbatas pada INTEGER / REAL / TEXT / BLOB / ANY — INT dan nama tipe kustom tidak diizinkan.
Di latihan berikutnya kamu akan membuat sendiri tabel typed_strict dengan STRICT, dan di latihan-latihan setelahnya kamu akan memasukkan nilai yang cocok dan tidak cocok untuk melihat perbedaannya.
-- Mendeklarasikan dan memakai tabel STRICT (contoh read-only)
CREATE TABLE IF NOT EXISTS typed_strict(a INTEGER, b TEXT, c REAL) STRICT;
-- Baris dengan tipe yang cocok dimasukkan dengan baik
INSERT INTO typed_strict VALUES (1, '2024-03-15', 1.5);
-- Memasukkan string non-angka ke kolom a INTEGER
-- tidak dikonversi secara implisit -- INSERT-nya error:
-- cannot store TEXT value in INTEGER column typed_strict.a
INSERT INTO typed_strict VALUES ('not-a-number', 'x', 1.0);
Cek Pemahaman
Jawab setiap pertanyaan satu per satu.
Soal 2Manakah yang dengan benar menggambarkan peran strftime('%Y', sale_date)?
Soal 3Manakah yang dengan benar menggambarkan apa yang terjadi ketika kamu mencoba INSERT string non-angka ke kolom INTEGER di tabel STRICT?