PostgreSQL cung cấp một vài hàm built-in để làm việc với giá trị thời gian hiện tại. Mấy hàm này cực kỳ hữu ích cho các task như tự động theo dõi thời gian tạo bản ghi, tạo báo cáo dựa trên ngày hiện tại hoặc kiểm tra xem sự kiện có xảy ra trong một khoảng thời gian nhất định không. Cùng xem qua ba hàm chính: NOW(), CURRENT_DATE và CURRENT_TIME.
NOW(): lấy ngày và giờ hiện tại
Hàm NOW() trả về ngày và giờ hiện tại theo định dạng TIMESTAMP WITH TIME ZONE. Nghĩa là kết quả sẽ bao gồm thời gian chính xác kèm theo múi giờ của server.
Ví dụ:
SELECT NOW();
-- Kết quả: 2025-05-25 14:30:45.761523+03
Lưu ý là kết quả gồm có:
- ngày (
2025-05-25), - giờ (
14:30:45.761523), - múi giờ (
+03).
Nếu bạn không cần múi giờ, có thể ép kiểu kết quả về TIMESTAMP:
SELECT NOW()::TIMESTAMP;
-- Kết quả: 2025-05-25 14:30:45.761523
CURRENT_DATE: lấy ngày hiện tại
Hàm CURRENT_DATE chỉ trả về ngày hiện tại, không có giờ. Kiểu trả về là DATE.
Ví dụ:
SELECT CURRENT_DATE;
-- Kết quả: 2025-05-25
Cái này tiện khi bạn không cần quan tâm đến giờ, ví dụ như khi tính tuổi hoặc group dữ liệu theo ngày.
CURRENT_TIME: lấy giờ hiện tại
Hàm CURRENT_TIME trả về giờ hiện tại theo định dạng TIME WITH TIME ZONE. Nếu không cần múi giờ, bạn có thể ép kiểu về TIME.
Ví dụ:
SELECT CURRENT_TIME;
-- Kết quả: 14:30:45.761523+03
SELECT CURRENT_TIME::TIME;
-- Kết quả: 14:30:45.761523
Ví dụ sử dụng các hàm này
Cùng xem một vài ví dụ thực tế mà mấy hàm này sẽ rất hữu ích nhé.
Tự động điền thời gian tạo bản ghi
Khi thêm bản ghi vào bảng, thường thì rất tiện nếu tự động lưu lại ngày giờ tạo. Trong PostgreSQL, bạn có thể làm điều này bằng cách set DEFAULT NOW() khi tạo bảng.
Ví dụ tạo bảng:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_name TEXT NOT NULL,
created_at TIMESTAMP DEFAULT NOW() -- thời điểm tạo dòng
);
Thêm bản ghi:
INSERT INTO orders (customer_name) VALUES ('Otto Lin');
Xem nội dung bảng:
SELECT * FROM orders;
Kết quả:
| id | customer_name | created_at |
|---|---|---|
| 1 | Otto Lin | 2024-11-25 14:45:12.154678 |
Lọc dữ liệu theo ngày
Giả sử bạn có bảng đơn hàng và muốn lấy tất cả đơn tạo hôm nay. Dùng hàm CURRENT_DATE để lọc nhé:
SELECT *
FROM orders
WHERE created_at::DATE = CURRENT_DATE;
Ở đây mình dùng created_at::DATE để bỏ phần giờ, chỉ lấy ngày thôi.
Khác biệt giữa NOW() và CURRENT_TIMESTAMP
Nhìn qua thì NOW() và CURRENT_TIMESTAMP có vẻ giống nhau. Thực ra đúng là vậy. Chỉ là NOW() đến từ một chuẩn, còn CURRENT_TIMESTAMP từ chuẩn khác thôi.
NOW() — hàm của PostgreSQL
Hàm NOW() là hàm built-in của PostgreSQL, trả về kiểu TIMESTAMP WITH TIME ZONE (timestamptz). Đây là thời gian hiện tại của server tại thời điểm bắt đầu chạy truy vấn SQL.
Ví dụ:
SELECT NOW();
CURRENT_TIMESTAMP — chuẩn SQL
CURRENT_TIMESTAMP là biểu thức được định nghĩa bởi chuẩn SQL, và nó cũng trả về TIMESTAMP WITH TIME ZONE trong PostgreSQL. Thực chất, PostgreSQL implement CURRENT_TIMESTAMP bằng cách gọi cùng hàm với NOW().
Ví dụ:
SELECT CURRENT_TIMESTAMP;
So sánh thực tế
SELECT NOW(), CURRENT_TIMESTAMP;
Kết quả:
| now | current_timestamp |
|---|---|
| 2025-05-25 14:30:45+03 | 2025-05-25 14:30:45+03 |
Hai giá trị này giống hệt nhau vì được tính ngay lúc bắt đầu truy vấn.
Dùng hàm thời gian trong điều kiện lọc
Giờ thử viết truy vấn lấy các bản ghi tạo trong 7 ngày gần nhất nhé. Dùng NOW() với phép toán ngày:
SELECT *
FROM orders
WHERE created_at >= NOW() - INTERVAL '7 days';
Tương tự, nếu muốn lấy đơn hàng trong tháng hiện tại, bạn có thể dùng hàm DATE_TRUNC() để cắt đầu tháng:
SELECT *
FROM orders
WHERE created_at >= DATE_TRUNC('month', NOW());
DATE_TRUNC() là hàm khá hay ho, mình sẽ nói kỹ hơn ở mấy bài sau :P
Mẹo thực tế
- Dùng
NOW()hoặcCURRENT_TIMESTAMPnếu bạn cần thời gian chính xác kèm múi giờ. - Dùng
CURRENT_DATEnếu chỉ cần ngày (ví dụ tính tuổi hoặc phân tích sự kiện theo ngày). CURRENT_TIMEthường dùng trong báo cáo hoặc giao diện, khi cần hiển thị thời gian đã dùng cho task nào đó.
Bài sau tụi mình sẽ bắt đầu tách các phần của ngày và giờ bằng hàm EXTRACT() và AGE(). Nhờ mấy hàm này, bạn có thể dễ dàng tính tuổi người hoặc xử lý dữ liệu theo ngày, tháng, năm luôn.
GO TO FULL VERSION