Chuyển đến nội dung chính
Mô-đun 6 · Bài học 2 trong tổng số 422/57 trong khóa học~12 min
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ạng YYYY-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ộtLoại
customers.signed_up_onDATE
orders.ordered_atTIMESTAMP
orders.shipped_atTIMESTAMP (có thể là NULL)

TRÍCH DẪN - đọc một phần

EXTRACT(part FROM date) trích xuất một số:

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;

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ờ:

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;

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:

SQL
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:

SQL
WHERE  shipped_at - ordered_at > INTERVAL '1 day'

Thêm ngày vào một ngày:

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

Hãy thử nó

tập thể dục#sql.m6.l2.e1
Nỗ lực: 0Đang tải…

Đế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.

Đang tải trình chỉnh sửa…
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

tập thể dục#sql.m6.l2.e2
Nỗ lực: 0Đang tải…

Đố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.

Đang tải trình chỉnh sửa…
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ử