Bạn đã từng gặp app nào mà không đụng tới ngày giờ chưa? Đặt hàng online, lịch biểu, lịch sử thay đổi trong database — tất cả đều phụ thuộc vào việc lưu trữ thời gian cho chuẩn. PostgreSQL cho bạn công cụ cực mạnh để xử lý mấy kiểu dữ liệu này, và tất nhiên, bảng thời gian không phải mấy cái bảng đồng hồ đâu, mà là cấu trúc rõ ràng để phân tích và sắp xếp sự kiện.
Các kiểu ngày giờ cho phép bạn:
- Lưu chỉ ngày
DATE, chỉ giờTIMEhoặc cả hai cùng lúcTIMESTAMP. - Làm các phép toán như cộng ngày, tính chênh lệch giữa các ngày và lọc bản ghi theo tiêu chí thời gian.
- Làm việc với múi giờ (nhưng cái này để bài sau nói kỹ hơn nha).
Các kiểu dữ liệu: DATE, TIME, TIMESTAMP
Kiểu dữ liệu DATE
Kiểu DATE dùng để lưu chỉ ngày thôi, không có giờ. Nó lưu năm, tháng, ngày. Dùng kiểu này khi:
- Cần lưu ngày sinh của user.
- Ngày sự kiện quan trọng, còn giờ thì không quan tâm.
Ví dụ format: YYYY-MM-DD (năm-tháng-ngày).
Ví dụ:
| id | name - VARCHAR(100) | event_date - DATE |
|---|---|---|
| 1 | SQL Workshop | 2025-06-15 |
| 2 | Python | 2025-06-17 |
| 3 | Java Courses | 2025-06-25 |
Kiểu dữ liệu TIME
Kiểu TIME dùng để lưu chỉ giờ thôi. Dùng khi:
- Cần lưu lịch biểu, ví dụ giờ bắt đầu làm việc.
- Giờ quan trọng, còn ngày thì không cần.
Ví dụ format: HH:MI:SS (giờ:phút:giây).
Ví dụ:
| id | task_name - VARCHAR(100) | start_time - TIME |
|---|---|---|
| 1 | Team Meeting | 09:00:00 |
| 2 | Code Review | 11:30:00 |
| 3 | Client Call | 15:00:00 |
Kiểu dữ liệu TIMESTAMP
TIMESTAMP là kết hợp ngày và giờ. Dùng khi:
- Cần lưu khoảnh khắc cụ thể, ví dụ lúc user đăng nhập.
- Cần dấu thời gian để tracking thay đổi (logging).
Ví dụ format: YYYY-MM-DD HH:MI:SS (năm-tháng-ngày giờ:phút:giây).
Ví dụ:
| id | action - VARCHAR(100) | login_time - TIMESTAMP |
|---|---|---|
| 1 | User Login | 2023-10-15 14:30:00 |
| 2 | File Uploaded | 2023-10-15 15:10:00 |
| 3 | User Logout | 2023-10-15 16:45:00 |
Thao tác với ngày và giờ
Giờ khi đã biết có những kiểu nào rồi, cùng xem cách dùng tụi nó nha. PostgreSQL có sẵn nhiều hàm để thao tác với ngày giờ luôn.
Lấy từng phần của ngày và giờ
Nếu bạn có một timestamp (TIMESTAMP), và muốn lấy riêng năm, tháng, ngày hoặc giờ, dùng hàm EXTRACT nha.
Ví dụ:
SELECT EXTRACT(YEAR FROM TIMESTAMP '2025-06-15 14:30:00') AS year;
-- Kết quả: 2025
SELECT EXTRACT(MONTH FROM TIMESTAMP '2025-06-15 14:30:00') AS month;
-- Kết quả: 06
SELECT EXTRACT(DAY FROM TIMESTAMP '2025-06-15 14:30:00') AS day;
-- Kết quả: 15
Cộng trừ khoảng thời gian
Muốn biết tuần sau là ngày nào? Hay hôm qua là ngày nào? Dùng phép toán với interval nha.
Ví dụ:
-- Cộng 7 ngày vào ngày hiện tại
SELECT CURRENT_DATE + INTERVAL '7 days' AS next_week;
-- Trừ 1 tháng
SELECT CURRENT_DATE - INTERVAL '1 month' AS last_month;
So sánh ngày
Làm sao biết sự kiện đã xảy ra chưa? Dễ hơn debug bug luôn — chỉ cần so sánh giá trị thôi.
Ví dụ:
SELECT event_date
FROM events
WHERE event_date < CURRENT_DATE;
-- Lấy tất cả sự kiện trong quá khứ
Chi tiết về các hàm xử lý ngày giờ sẽ có ở các bài sau. Giờ chỉ cần nhớ là có mấy kiểu này là đủ rồi nha.
Vấn đề múi giờ và chuẩn thời gian
Dù bài này chưa đi sâu vào múi giờ, nhưng cũng phải nhắc là PostgreSQL hỗ trợ kiểu TIMESTAMPTZ (timestamp có múi giờ). Ví dụ, 2023-10-15 14:30:00+02 nghĩa là thời gian này thuộc múi giờ UTC+2.
Chắc chắn tụi mình sẽ học kỹ vụ này trong khoá, nhưng để sau nha :P
Ví dụ
Giờ là lúc test thử kiến thức mới học. Tạo bảng lưu lịch học của sinh viên nha.
| id | subject_name | class_date - DATE | start_time - TIME | end_time - TIME | created_at - TIMESTAMP |
|---|---|---|---|---|---|
| 1 | Mathematics | 2023-10-16 | 09:00:00 | 10:30:00 | 2023-10-12 14:00:00 |
| 2 | Physics | 2023-10-16 | 11:00:00 | 12:30:00 | 2023-10-12 14:00:00 |
| 3 | Chemistry | 2023-10-17 | 09:00:00 | 10:30:00 | 2023-10-12 14:01:00 |
| 4 | Literature | 2023-10-17 | 11:00:00 | 12:30:00 | 2023-10-12 14:01:00 |
| 5 | Computer Science | 2023-10-18 | 10:00:00 | 11:30:00 | 2023-10-12 14:02:00 |
Chỉ vài bài nữa là bạn sẽ tự tạo được bảng kiểu này bằng SQL query luôn. Giờ thì cứ ngắm nghía trước đã :)
Lỗi thường gặp
Định dạng ngày giờ: khi insert dữ liệu nhớ đúng format: YYYY-MM-DD cho ngày và HH:MI:SS cho giờ. PostgreSQL sẽ không hiểu nếu bạn thử insert kiểu "15/10/2023" đâu nha.
Sai kiểu dữ liệu: thử ghi giá trị text vào trường kiểu DATE là lỗi liền.
Lỗi khoảng thời gian: ví dụ bạn cộng 30 ngày vào tháng 2, PostgreSQL sẽ xử lý đúng, nhưng ngày kết quả có thể đã sang tháng 3 rồi.
Giờ bạn đã biết về các kiểu dữ liệu ngày giờ trong PostgreSQL rồi đó. Trong project thực tế, nó giúp bạn xử lý lịch biểu, log sự kiện hoặc tracking các sự kiện quan trọng trong hệ thống luôn!
GO TO FULL VERSION