Các hàm ngày giờ trong PostgreSQL (date/time functions) cho phép thao tác, trích xuất và tính toán trên dữ liệu dạng ngày, giờ hoặc timestamp. Đây là nhóm hàm quan trọng trong quá trình khai thác và phân tích dữ liệu, bởi phần lớn dữ liệu trong thực tế đều gắn với yếu tố thời gian như ngày bán hàng, thời điểm giao dịch hay lịch sử hoạt động của hệ thống.
Nhờ các hàm này, dữ liệu có thể được phân tích theo thời gian, so sánh giữa các giai đoạn khác nhau và hỗ trợ dự báo dựa trên các chu kỳ dữ liệu. Trong thực tế, các hàm ngày giờ trong PostgreSQL thường được sử dụng để phân tích doanh thu theo ngày, tuần hoặc tháng, đo lường thời gian phản hồi của hệ thống và theo dõi hành vi khách hàng theo từng mốc thời gian.

1. DATE / TO_DATE
Toán tử ép kiểu ::DATE và hàm TO_DATE sử dụng để chuyển đổi timestamp sang date hoặc chuyển chuỗi thành date. Ứng dụng trong:
- Lấy phần ngày từ timestamp (bỏ giờ phút giây)
- Chuyển đổi định dạng ngày
- So sánh theo ngày
Toán tử ::DATE giúp lấy ngày từ orderDate
SELECT id, order_date, order_date::DATE AS date_only
FROM orders;

Ví dụ: Hàm TO_DATE chuyển đổi chuỗi thành date
SELECT TO_DATE('2026-03-10', 'YYYY-MM-DD') AS converted_date;

SELECT TO_DATE('30/4/2026', 'DD/MM/YYYY') AS converted_date;

Ví dụ: Thống kê đơn hàng theo ngày với nhiều thông tin
SELECT
o.order_date::DATE AS order_day,
TO_CHAR(o.order_date::DATE, 'Day') AS day_of_week,
COUNT(DISTINCT o.id) AS total_orders,
COUNT(DISTINCT o.customer_id) AS unique_customers,
SUM(od.quantity * p.price) AS daily_revenue,
AVG(od.quantity * p.price) AS avg_transaction_value,
STRING_AGG(DISTINCT o.status, ', ') AS statuses
FROM orders o
JOIN order_details od ON o.id = od.order_id
JOIN products p ON od.product_id = p.id
WHERE o.order_date >= CURRENT_DATE - INTERVAL '3 years'
GROUP BY o.order_date::DATE
ORDER BY order_day DESC;

2. DATE_PART / EXTRACT
DATE_PART / EXTRACT sử dụng để trích xuất một phần cụ thể từ date/timestamp (năm, tháng, ngày, giờ, v.v.). Ứng dụng
- Lấy năm, tháng, ngày, giờ riêng biệt
- Thống kê theo tháng, năm, quý
- Phân tích theo thời gian
Ví dụ: Lấy ngày từ order_date
SELECT
id,
DATE_PART('year', order_date) AS order_year,
DATE_PART('month', order_date) AS order_month
FROM orders;

Đếm đơn hàng theo từng tháng
SELECT
DATE_PART('year', order_date) AS year,
DATE_PART('month', order_date) AS month,
COUNT(*) AS order_count
FROM orders
GROUP BY year, month
ORDER BY year DESC, month DESC;

Trích các thành phần của thời gian bằng Extract
SELECT
id, customer_id, order_date,
EXTRACT(YEAR FROM order_date) AS năm,
EXTRACT(MONTH FROM order_date) AS tháng,
EXTRACT(DAY FROM order_date) AS ngày,
EXTRACT(HOUR FROM order_date) AS giờ,
EXTRACT(MINUTE FROM order_date) AS phút,
EXTRACT(SECOND FROM order_date)::INT AS giây
FROM orders;

3. AGE
AGE là hàm sử dụng để tính khoảng cách thời gian giữa hai mốc thời gian.
Ứng dụng trong:
- Tính tuổi khách hàng, thời gian là thành viên
- Tính thời gian giao hàng
- Phân tích chu kỳ mua hàng
Ví dụ: Tính số năm khách hàng đã tham gia
SELECT
id,
first_name,
last_name,
ngay_gia_nhap,
AGE(CURRENT_DATE, ngay_gia_nhap) AS membership_duration,
DATE_PART('year', AGE(CURRENT_DATE, ngay_gia_nhap)) AS years_as_member
FROM customers;

Ví dụ: Tính số ngày từ khi đặt hàng
SELECT
id,
order_date,
CURRENT_DATE - order_date::DATE AS days_since_order
FROM orders;

4. TO_CHAR
TO_CHAR sử dụng để định dạng date/timestamp thành chuỗi theo mẫu mong muốn. Ứng dụng trong:
- Hiển thị ngày theo định dạng dễ đọc
- Xuất báo cáo với định dạng đặc biệt
- Chuyển đổi ngày thành chuỗi để nhóm hoặc hiển thị
Ví dụ: Định dạng ngày đặt hàng
SELECT
id,
TO_CHAR(order_date, 'DD/MM/YYYY') AS formatted_date,
TO_CHAR(order_date, 'Day, DD Month YYYY') AS long_format
FROM orders;

Ví dụ: Lấy tháng-năm để nhóm
SELECT
TO_CHAR(order_date, 'YYYY-MM') AS month_year,
COUNT(*) AS order_count
FROM orders
GROUP BY month_year
ORDER BY month_year DESC;

5. Tóm tắt gọn
- DATE / TO_DATE: Chuyển đổi timestamp sang date hoặc chuyển chuỗi thành date
- DATE_PART / EXTRACT: Trích xuất một phần cụ thể từ date/timestamp (năm, tháng, ngày, giờ, v.v.)
- AGE: Tính khoảng cách thời gian giữa hai mốc thời gian
- TO_CHAR: Định dạng date/timestamp thành chuỗi theo mẫu mong muốn
KẾT LUẬN
Các hàm ngày giờ trong PostgreSQL đóng vai trò quan trọng trong việc xử lý và phân tích dữ liệu theo thời gian. Thông qua các hàm như DATE, TO_DATE, DATE_PART, EXTRACT, AGE và TO_CHAR, người dùng có thể trích xuất thông tin từ dữ liệu thời gian, tính toán khoảng cách giữa các mốc thời gian và định dạng dữ liệu ngày giờ theo nhiều cách khác nhau.
Khi kết hợp các hàm này với các câu lệnh SQL như GROUP BY, ORDER BY hoặc các hàm thống kê, người dùng có thể thực hiện các phân tích dữ liệu theo ngày, tháng hoặc năm một cách hiệu quả. Việc nắm vững các hàm ngày giờ trong PostgreSQL giúp xây dựng các truy vấn phân tích mạnh mẽ và hỗ trợ tốt cho các bài toán báo cáo và khai thác dữ liệu trong thực tế.


