Câu 1Phát biểu nào sau đây là lợi ích đúng khi lưu ngày dưới dạng chuỗi ISO như '2024-03-15'?
Kiểu Date/Time và bảng STRICT
Dùng bảng perf_sales 50.000 dòng, học ba định dạng lưu ngày (chuỗi ISO, julianday, unixepoch), tổng hợp theo năm và theo phạm vi với date() / strftime(), và cách bảng typed_strict từ chối các sai khớp kiểu — tất cả chạy trực tiếp trên trình duyệt.
Dữ liệu sẽ dùng — perf_sales
Ngày tháng được lưu dưới dạng chuỗi hoặc số, và bạn đọc hoặc tính toán chúng bằng các hàm như date() / strftime().
Nửa đầu, bạn sẽ dùng cột sale_date của bảng bán hàng perf_sales để kiểm tra ba định dạng lưu trữ và cách trích xuất giá trị; nửa sau, bạn sẽ tự tạo một bảng STRICT để xem điều gì xảy ra khi bạn chèn một giá trị không khớp với kiểu khai báo.
Ba định dạng lưu trữ ngày — chuỗi ISO / julianday / unixepoch
Ngày và giờ có thể được lưu ở ba định dạng chính.
| Định dạng | Giá trị ví dụ | Mục đích chính |
|---|---|---|
| Chuỗi ISO | '2024-03-15' (có giờ: '2024-03-15 12:30:00') | Người đọc được; sắp xếp và so sánh phạm vi hoạt động đúng như so sánh chuỗi thông thường (lựa chọn phổ biến nhất) |
| julianday | julianday('2024-03-15') → 2460384.5 (một số thập phân đếm số ngày từ xa xưa) | Tính chênh lệch giữa hai ngày theo đơn vị ngày |
| unixepoch | strftime('%s', ...) → 1710460800 (số nguyên giây tính từ 1970-01-01) | Tính toán thời gian theo giây / tương tác giữa các hệ thống |
Dù bạn lưu ở định dạng nào, bạn có thể đọc lại dưới dạng 'YYYY-MM-DD' bằng date() hoặc 'YYYY-MM-DD HH:MM:SS' bằng datetime().
Khóa học này dùng chuỗi ISO mặc định vì nó người đọc được và dễ so sánh, và chỉ chuyển sang julianday / unixepoch khi cần thiết.
-- Cùng một ngày trong 3 định dạng (ví dụ chỉ đọc)
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;
-- Chuyển từng định dạng trong 3 định dạng về dạng ngày đọc được
SELECT date(julianday('2024-03-15')) AS from_jd,
datetime(1710460800,'unixepoch') AS from_unix,
date('2024-03-15') AS from_iso;
-- Với chuỗi ISO, so sánh phạm vi hoạt động đúng như so sánh chuỗi thông thường
SELECT '2024-03-15' BETWEEN '2024-01-01' AND '2024-12-31' AS in_2024; -- 1
Thao tác và tổng hợp ngày với date() và strftime()
date(value, modifier...): trả về phần ngày dưới dạng'YYYY-MM-DD', và cho phép bạn tính toán ngày với modifier như'+1 month'/'-7 days'/'start of month'strftime(format, value): trích xuất một phần của ngày dưới dạng chuỗi bằng cách dùng định dạng như%Y(năm),%m(tháng),%d(ngày),%w(thứ trong tuần)- Kết hợp
strftime('%Y', sale_date)vớiGROUP BYđể tổng hợp theo năm - Vì
sale_dateđược lưu dưới dạng chuỗi ISO, các điều kiện phạm vi như `WHERE sale_date >= '2024-01-01'` hoạt động đúng như so sánh chuỗi thông thường
-- Thao tác ngày (ví dụ chỉ đọc)
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
-- Đếm theo năm (chuỗi ISO, nên rút năm bằng strftime và GROUP BY)
SELECT strftime('%Y', sale_date) AS yr, COUNT(*) AS cnt
FROM perf_sales
GROUP BY yr
ORDER BY yr;
Bảng STRICT — áp đặt kiểu nghiêm ngặt
Type affinity bạn đã thấy đến giờ chuyển đổi linh hoạt các chuỗi trông giống số.
Ngược lại, khi bạn thêm STRICT ở cuối định nghĩa bảng, bảng đó từ chối lưu các giá trị có kiểu không khớp với kiểu khai báo.
Nếu bạn thử chèn một chuỗi không phải số vào cột số, giá trị không được chuyển đổi ngầm — bạn nhận được lỗi.
Dùng cái này cho các bảng mà bạn muốn bắt nhầm kiểu sớm.
Trong bảng STRICT, các kiểu cột được phép giới hạn ở INTEGER / REAL / TEXT / BLOB / ANY — không cho phép INT và các tên kiểu tự đặt.
Ở bài tập tiếp theo, bạn sẽ tự tạo bảng typed_strict với STRICT, và ở các bài tập sau, bạn sẽ chèn cả giá trị khớp và không khớp để thấy sự khác biệt.
-- Khai báo và dùng bảng STRICT (ví dụ chỉ đọc)
CREATE TABLE IF NOT EXISTS typed_strict(a INTEGER, b TEXT, c REAL) STRICT;
-- Các dòng có kiểu khớp được chèn bình thường
INSERT INTO typed_strict VALUES (1, '2024-03-15', 1.5);
-- Chèn một chuỗi không phải số vào cột a INTEGER
-- không được chuyển đổi ngầm -- INSERT báo lỗi:
-- cannot store TEXT value in INTEGER column typed_strict.a
INSERT INTO typed_strict VALUES ('not-a-number', 'x', 1.0);
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Phát biểu nào mô tả đúng vai trò của strftime('%Y', sale_date)?
Câu 3Phát biểu nào mô tả đúng điều xảy ra khi bạn thử INSERT một chuỗi không phải số vào cột INTEGER của bảng STRICT?