Các hàm ngày giờ trong PostgreSQL

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.

Các hàm ngày giờ trong PostgreSQL

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