Bài học theo mô-đun (2/4)
Chức năng ngày và dấu thời gian
Ngày và dấu thời gian có ở khắp mọi nơi: đơn đặt hàng, thông tin đăng nhập, sự kiện, thanh toán. trong Bài học này chúng ta thấy cách trích xuất các phần từ một ngày (năm, tháng…), cắt ngắn thành mức độ chi tiết (tháng, tuần…), tính khoảng thời gian khác biệt và so sánh giữa các thời kỳ.
Các loại cơ sở
PostgreSQL phân biệt:
DATE— chỉ ngày, định dạngYYYY-MM-DD;TIMESTAMP— ngày + giờ, không có múi giờ;TIMESTAMPTZ— ngày + giờ + múi giờ;INTERVAL— một dấu chấm (ví dụ:'3 days','2 hours 30 minutes').
Trong tập dữ liệu ecommerce của chúng tôi:
| Cột | Loại |
|---|---|
customers.signed_up_on | DATE |
orders.ordered_at | TIMESTAMP |
orders.shipped_at | TIMESTAMP (có thể là NULL) |
TRÍCH DẪN - đọc một phần
EXTRACT(part FROM date) trích xuất một số:
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;Các bộ phận được sử dụng nhiều nhất: YEAR, MONTH, DAY, HOUR, MINUTE, DOW (ngày
của tuần 0-6), DOY (ngày trong năm).
DATE_TRUNC — làm tròn xuống
DATE_TRUNC('part', date) "cắt ngắn" ngày thành chi tiết. Đó là
cần thiết để tổng hợp theo tháng, tuần, giờ:
-- 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;Các phần hợp lệ: 'year', 'quarter', 'month', 'week', 'day',
'hour', 'minute', 'second'.
Để dễ đọc, mọi người thường chuyển tới DATE khi không cần thời gian:
DATE_TRUNC('month', ordered_at)::date.
Sự khác biệt và khoảng thời gian
Trừ hai TIMESTAMP sẽ tạo ra INTERVAL:
SELECT id,
shipped_at - ordered_at AS wait_time
FROM orders
WHERE shipped_at IS NOT NULL;So sánh với một chữ INTERVAL:
WHERE shipped_at - ordered_at > INTERVAL '1 day'Thêm ngày vào một ngày:
SELECT signed_up_on + INTERVAL '30 days' AS trial_expiration
FROM customers;Hãy thử nó
Đếm xem có bao nhiêu đơn hàng được đặt mỗi năm. Hai cột: năm (số nguyên) và order_count. Thứ tự tăng dần theo năm.
Hiển thị gợi ý
EXTRACT(YEAR FROM order_at) trả về một SỐ: chuyển nó thành int với ::int để dễ đọc.
Giải pháp khả dụng sau 3 lần thử
Xem lại bài tập
Đối với mỗi tháng của năm 2024, hiển thị ngày đầu tiên của tháng (cột tháng, loại ngày) và số lượng đơn đặt hàng. Đặt hàng theo tháng.
Hiển thị gợi ý
DATE_TRUNC('tháng', order_at) trả về ngày đầu tiên của tháng dưới dạng dấu thời gian; ::date chuyển đổi nó thành ngày.
Giải pháp khả dụng sau 3 lần thử