Chuyển đến nội dung chính

Thành thạo so sánh ngày trong SQL: Cách truy vấn các ngày lớn hơn một ngày cụ thể

Tìm hiểu cách truy vấn và lọc ngày lớn hơn một ngày cụ thể trong SQL. So sánh sự khác biệt của logic "lớn hơn ngày" trong MySQL, PostgreSQL và SQL Server.
Đã cập nhật 5 thg 6, 2026  · 11 phút đọc

Hiểu cách truy vấn các ngày lớn hơn một ngày cụ thể là điều tối quan trọng để quản lý và phân tích cơ sở dữ liệu hiệu quả. Hướng dẫn này sẽ cung cấp chỉ dẫn toàn diện về so sánh ngày trong SQL trên nhiều hệ quản trị cơ sở dữ liệu, bao gồm SQL Server, PostgreSQL và Oracle. Dù bạn đang xử lý phân tích dữ liệu lịch sử, lập báo cáo hay lọc bản ghi, thành thạo kỹ thuật này sẽ nâng cao khả năng viết truy vấn SQL của bạn.

Kết thúc hướng dẫn này, bạn sẽ có thể:

  • Hiểu những khác biệt tinh tế về định dạng và hàm xử lý ngày trong các hệ CSDL SQL khác nhau, bao gồm SQL Server, PostgreSQL và Oracle. 
  • Vận dụng các ví dụ thực tiễn vào những tình huống trong đời thực. 

Nếu bạn là nhà phân tích dữ liệu hoặc nhà khoa học dữ liệu sẵn sàng học thêm, tôi khuyến nghị theo học lộ trình kỹ năng SQL Fundamentals của DataCamp để làm quen với việc truy vấn dữ liệu từ cơ sở dữ liệu. Và với những ai muốn mở rộng chuyên môn về cơ sở dữ liệu, hãy xem khóa học Database Design, cung cấp những hiểu biết về xây dựng CSDL hiệu quả.

Giới thiệu về so sánh ngày trong SQL

So sánh ngày quan trọng trong SQL vì cho phép các chuyên gia dữ liệu lọc và sắp xếp dữ liệu khi phân tích. Phương pháp này đặc biệt hữu ích trong báo cáo tài chính hoặc quản lý tồn kho, nơi cần phân tích xu hướng.

Toán tử “lớn hơn” (>) của SQL được dùng với kiểu ngày để so sánh hai giá trị ngày. Khi bạn dùng toán tử “lớn hơn” trong truy vấn SQL với ngày, truy vấn sẽ trả về các bản ghi có ngày muộn hơn ngày chỉ định. Ví dụ, truy vấn dưới đây sẽ trả về các dòng trong bảng Orders nơi OrderDate muộn hơn 2023-01-01.

SELECT *
FROM Orders
WHERE OrderDate > '2023-01-01';

Hãy bắt đầu bằng cách điểm nhanh các toán tử SQL cơ bản dùng để lọc dữ liệu. Những toán tử này cũng có trong SQL Basics Cheat Sheet của chúng tôi, bạn có thể xem lại trước khi thử các ví dụ bên dưới.

Bằng (=)

Toán tử = được dùng trong SQL để so sánh hai giá trị có bằng nhau hay không. Dưới đây là ví dụ khi toán tử được dùng với giá trị ngày. Truy vấn SQL sẽ trả về các dòng trong bảng Orders nơi OrderDate bằng 2023-01-01.

-- Chọn tất cả đơn hàng được đặt vào ngày 1 tháng 1 năm 2023
SELECT *
FROM Orders
WHERE OrderDate = '2023-01-01';

Khác (!= hoặc <>)

Toán tử != hoặc <> so sánh hai giá trị và trả về những giá trị khác với giá trị tham chiếu. Ví dụ, khi dùng với giá trị ngày, toán tử != hoặc <> sẽ trả về các dòng có ngày khác với ngày tham chiếu. Bạn cũng có thể đọc hướng dẫn SQL NOT EQUAL Operator: A Beginner's Guide để hiểu rõ hơn những điểm tinh tế.

-- Chọn tất cả đơn hàng không được đặt vào ngày 1 tháng 1 năm 2023
SELECT *
FROM Orders
WHERE OrderDate != '2023-01-01';
-- Cú pháp thay thế dùng <>
SELECT *
FROM Orders
WHERE OrderDate <> '2023-01-01';

Nhỏ hơn (<)

Toán tử < được dùng trong SQL để kiểm tra giá trị bên trái nhỏ hơn giá trị bên phải hay không. Khi dùng trong truy vấn SQL với giá trị ngày, truy vấn sẽ trả về bản ghi có ngày sớm hơn ngày chỉ định. Ví dụ, truy vấn dưới đây sẽ trả về các dòng trong bảng Orders nơi OrderDate sớm hơn 2023-01-01.

-- Chọn tất cả đơn hàng được đặt trước ngày 1 tháng 1 năm 2023
SELECT *
FROM Orders
WHERE OrderDate < '2023-01-01';

Lớn hơn hoặc bằng (>=)

Toán tử >= kiểm tra liệu giá trị bên trái lớn hơn hoặc bằng giá trị bên phải. Khi dùng toán tử này trong SQL để truy vấn giá trị ngày, nó sẽ trả về các bản ghi có ngày bằng hoặc lớn hơn giá trị tham chiếu.

-- Chọn tất cả đơn hàng được đặt vào hoặc sau ngày 1 tháng 1 năm 2023
SELECT *
FROM Orders
WHERE OrderDate >= '2023-01-01';

Nhỏ hơn hoặc bằng (<=)

Toán tử <= được dùng trong SQL để kiểm tra liệu giá trị bên trái nhỏ hơn hoặc bằng giá trị bên phải. Khi dùng để truy vấn giá trị ngày, nó sẽ trả về bản ghi có ngày bằng hoặc nhỏ hơn giá trị tham chiếu.

-- Chọn tất cả đơn hàng được đặt vào hoặc trước ngày 1 tháng 1 năm 2023
SELECT *
FROM Orders
WHERE OrderDate <= '2023-01-01';

So sánh ngày trong SQL Server

Chúng ta có thể so sánh ngày trong SQL Server bằng các toán tử: <, <=, >, >==. Tuy nhiên, chúng ta sẽ trình bày các nội dung sau:

Dùng toán tử “lớn hơn” (>)

Toán tử “lớn hơn” (>) trong SQL Server được dùng để lọc ra các ngày muộn hơn ngày so sánh ở bên phải toán tử. Ví dụ, truy vấn dưới đây lọc bảng Orders và trả về các bản ghi đơn hàng được giao sau OrderDate 2023-01-01.

-- Chọn tất cả đơn hàng được giao sau ngày 1 tháng 1 năm 2023
SELECT *
FROM Orders
WHERE DeliveryDate > '2023-01-01';

Dùng hàm GETDATE()

Hàm GETDATE() trong SQL Server trả về ngày hiện tại theo hệ thống của người dùng. Do đó, bạn có thể dùng hàm này để truy vấn dữ liệu và lọc các dòng có ngày lớn hơn ngày hiện tại.

-- Chọn tất cả đơn hàng được giao sau ngày và giờ hiện tại
SELECT *
FROM Orders
WHERE DeliveryDate > GETDATE();

Dùng BETWEEN cho khoảng ngày

Toán tử BETWEEN trong SQL được dùng để lọc các giá trị trong một khoảng. Khi dùng với ngày trong SQL Server, bạn có thể lọc các dòng có ngày nằm trong khoảng đã nêu. Kết quả sẽ bao gồm cả ngày bắt đầu và kết thúc như trong truy vấn.

-- Chọn tất cả đơn hàng được giao từ ngày 1/1/2023 đến 31/12/2023
SELECT *
FROM Orders
WHERE DeliveryDate BETWEEN '2023-01-01' AND '2023-12-31';

Dùng CAST và CONVERT cho khoảng ngày

Bạn cũng có thể dùng các hàm CASTCONVERT để tránh lỗi. Những hàm này đảm bảo giá trị ngày được diễn giải và định dạng chính xác.

-- Chuyển đổi chuỗi sang kiểu date
SELECT CAST('2023-06-26' AS DATE) AS ConvertedDate;

-- Chuyển đổi chuỗi sang kiểu datetime
SELECT CAST('2023-06-26 14:30:00' AS DATETIME) AS ConvertedDateTime;
-- Chuyển đổi chuỗi sang kiểu date bằng CONVERT
SELECT CONVERT(DATE, '2023-06-26') AS ConvertedDate;

-- Chuyển đổi chuỗi sang kiểu datetime bằng CONVERT
SELECT CONVERT(DATETIME, '2023-06-26 14:30:00') AS ConvertedDateTime;

So sánh ngày trong PostgreSQL

PostgreSQL có một số mệnh đề khác nhau dùng để so sánh ngày. Chúng ta sẽ thảo luận một vài mệnh đề dưới đây.

Dùng toán tử “lớn hơn” (>)

Tương tự SQL Server, toán tử > trong PostgreSQL lọc các ngày lớn hơn ngày so sánh.

-- Chọn tất cả đơn hàng được đặt sau ngày 1 tháng 1 năm 2023
SELECT *
FROM Orders
WHERE OrderDate > '2023-01-01';

Dùng hàm EXTRACT

Hàm EXTRACT trong PostgreSQL được dùng để lấy các trường ngày như năm, tháng hoặc ngày. Trong truy vấn dưới đây, mệnh đề EXTRACT lọc các bản ghi cho NĂM 2023.

-- Chọn tất cả đơn hàng được đặt trong năm 2023
SELECT *
FROM Orders
WHERE EXTRACT(YEAR FROM OrderDate) = 2023;

Dùng hàm INTERVAL

Hàm INTERVAL trong PostgreSQL được dùng để thực hiện các phép tính về thời gian. INTERVAL cho phép bạn cộng hoặc trừ một khoảng thời gian nhất định vào/từ một ngày.

-- Chọn tất cả đơn hàng được đặt trong 30 ngày qua
SELECT *
FROM Orders
-- Lọc các đơn hàng được đặt trong vòng 30 ngày tính đến ngày hiện tại
WHERE OrderDate > NOW() - INTERVAL '30 days';

Dùng hàm DATE_PART

Hàm DATE_PART cho phép trích xuất một trường con từ giá trị ngày. Trường con này có thể là phần ngày hoặc phần thời gian. Truy vấn dưới đây trả về các đơn hàng đặt trong tháng 3, với giá trị kiểu double precision là 3 cho tháng thứ ba.

-- Chọn tất cả đơn hàng được đặt trong tháng 3
SELECT *
FROM Orders
WHERE DATE_PART('month', OrderDate) = 3;

Dùng hàm TO_DATE

Hàm TO_DATE trong PostgreSQL chuyển một chuỗi cho trước thành giá trị ngày theo định dạng cung cấp. Trong truy vấn dưới đây, giá trị ngày được cung cấp dưới dạng chuỗi. Vì vậy, bạn chuyển sang kiểu ngày theo định dạng YYYY-MM-DD.

-- Chọn tất cả đơn hàng được đặt vào ngày 1/1/2023 bằng chuỗi ngày
SELECT *
FROM Orders
WHERE OrderDate = TO_DATE('2023-01-01', 'YYYY-MM-DD');

Dùng BETWEEN cho khoảng ngày

Tương tự SQL Server, mệnh đề BETWEEN trong PostgreSQL lọc dữ liệu trong một khoảng cụ thể. Với các giá trị ngày, hàm BETWEEN lọc và trả về các dòng nằm giữa những ngày được chỉ định. Các ngày này cũng được bao gồm trong kết quả.

-- Chọn tất cả đơn hàng được đặt từ ngày 1/1/2023 đến 31/12/2023
SELECT *
FROM Orders
WHERE OrderDate BETWEEN '2023-01-01' AND '2023-12-31';

So sánh ngày trong Oracle

Dùng toán tử “lớn hơn” (>)

Toán tử > lọc các ngày muộn hơn ngày so sánh.

-- Chọn tất cả người dùng đang hoạt động có ngày kết thúc ở tương lai
SELECT *
FROM Users
-- Lọc người dùng có trạng thái 'Active'
WHERE Status = 'Active'
  -- Đảm bảo ngày kết thúc ở tương lai
  AND EndDate > SYSDATE;

Xử lý ngày NULL và điều kiện phức tạp

Khi so sánh ngày trong cơ sở dữ liệu Oracle, điều quan trọng là chỉ rõ các tình huống phức tạp, như ngày trống. Trong trường hợp này, chúng ta dùng mệnh đề IS NULL để lọc các bản ghi không có ngày.

-- Chọn tất cả người dùng đang hoạt động có ngày kết thúc ở tương lai hoặc không có ngày kết thúc (NULL)
SELECT *
FROM Users
-- Lọc người dùng có trạng thái 'Active'
WHERE Status = 'Active'
  -- Đảm bảo ngày kết thúc ở tương lai hoặc là NULL (không có ngày kết thúc)
  AND (EndDate > SYSDATE OR EndDate IS NULL);

Dùng BETWEEN cho khoảng ngày

Mệnh đề BETWEEN cũng được dùng trong Oracle để lọc dữ liệu trong một khoảng cụ thể. Với các giá trị ngày, hàm BETWEEN lọc và trả về các bản ghi nằm giữa những ngày được chỉ định. Các ngày này cũng được bao gồm trong kết quả.

-- Chọn tất cả người dùng đang hoạt động có ngày kết thúc nằm giữa ngày hiện tại và một ngày tương lai chỉ định (ví dụ, cuối năm)
SELECT *
FROM Users
-- Lọc người dùng có trạng thái 'Active'
WHERE Status = 'Active'
  -- Đảm bảo ngày kết thúc nằm giữa ngày hiện tại và một ngày tương lai chỉ định (ví dụ: 31/12/2023)
  AND EndDate BETWEEN SYSDATE AND DATE '2023-12-31';

Những lỗi thường gặp và thực hành tốt

Tôi đã từng gặp các vấn đề với ngày và toán tử “lớn hơn” trong SQL. Dưới đây là một số lỗi phổ biến tôi phát hiện và mẹo để tránh chúng.

Định dạng ngày không nhất quán

Dùng định dạng ngày không nhất quán trong truy vấn sẽ dẫn đến lỗi. Bạn có thể không nhận được kết quả mong muốn nếu trộn lẫn các định dạng ngày như YYYY-MM-DDMM-DD-YYYY

Để tránh các vấn đề này, hãy luôn đảm bảo bạn dùng định dạng ngày chuẩn. Bạn cũng có thể chuyển đổi ngày sang định dạng ưa thích hoặc theo quy ước địa phương bằng TO_DATE trong PostgreSQL hoặc Oracle. Với SQL Server, bạn có thể dùng các hàm CASTCONVERT.

-- Chuyển đổi chuỗi sang kiểu date
SELECT CAST('2023-06-26' AS DATE) AS ConvertedDate;

-- Chuyển đổi chuỗi sang kiểu datetime
SELECT CAST('2023-06-26 14:30:00' AS DATETIME) AS ConvertedDateTime;
-- Chuyển đổi chuỗi sang kiểu date bằng CONVERT
SELECT CONVERT(DATE, '2023-06-26') AS ConvertedDate;

-- Chuyển đổi chuỗi sang kiểu datetime bằng CONVERT
SELECT CONVERT(DATETIME, '2023-06-26 14:30:00') AS ConvertedDateTime;

Xử lý múi giờ

Bạn có thể thu được kết quả không chính xác khi xử lý dữ liệu trên nhiều múi giờ. Hơn nữa, không tính đến khác biệt múi giờ trong quá trình chuyển đổi ngày có thể gây lỗi.

Vì vậy, tôi khuyến nghị lưu trữ ngày theo UTC (Giờ Phối hợp Quốc tế) và dùng các hàm múi giờ tích hợp để chuyển đổi ngày.

-- Lưu ngày theo UTC và chuyển đổi sang múi giờ địa phương
SELECT *
FROM Orders
-- Lọc các đơn hàng nơi OrderDate theo UTC lớn hơn ngày hiện tại ở múi giờ 'America/New_York'
WHERE OrderDate AT TIME ZONE 'UTC' > SYSDATE AT TIME ZONE 'America/New_York';
-- Dùng các hàm múi giờ để so sánh chính xác
SELECT *
FROM Users
-- Lọc người dùng nơi EndDate theo UTC lớn hơn ngày hiện tại theo UTC
WHERE EndDate AT TIME ZONE 'UTC' > SYSDATE AT TIME ZONE 'UTC';

Tránh các lỗi thường gặp với ngày

Khi làm việc với ngày, điều quan trọng là tránh lỗi bằng cách chỉ truy xuất những giá trị bạn cần cho phân tích. Ví dụ, bạn có thể bỏ qua thành phần thời gian trong giá trị ngày nếu nó không liên quan đến phân tích của bạn. Xử lý rõ ràng các giá trị NULL để ngăn lỗi, đặc biệt trong các trường hợp giá trị ngày có thể chứa lỗi.

Viết truy vấn dễ đọc và dễ bảo trì

Bạn có thể sẽ viết các truy vấn phức tạp và lồng nhau, khiến việc đọc và theo dõi các mệnh đề trở nên khó khăn. Tương tự, nếu không thêm chú thích vào mã, sẽ khó giải thích mã thực hiện điều gì.

Vì thế, tôi khuyến nghị bạn thêm chú thích giải thích logic đằng sau các mệnh đề. Để truy vấn dễ đọc, bạn cũng có thể dùng các truy vấn con đơn giản hoặc Common Table Expressions (CTE). Hãy xem khóa học Reporting in SQL của chúng tôi để tìm hiểu thêm cách viết truy vấn dễ đọc và dễ bảo trì cho phân tích và báo cáo.

Lý do các phương pháp SQL khác nhau

Sự đa dạng trong các phương pháp so sánh ngày của SQL trên những hệ quản trị CSDL khác nhau như SQL Server, PostgreSQL và Oracle bắt nguồn từ quá trình phát triển và triết lý thiết kế riêng của từng hệ thống. Mỗi hệ thống được phát triển độc lập và phục vụ các nhu cầu người dùng cùng yêu cầu tương thích khác nhau, dẫn tới việc triển khai các tiêu chuẩn SQL theo những cách riêng và bổ sung các tính năng độc quyền.

Chẳng hạn:

  • SQL Server do Microsoft phát triển, tích hợp các hàm và cú pháp phù hợp chặt chẽ với các sản phẩm Microsoft khác, hướng tới khả năng tích hợp và dễ dùng trong hệ sinh thái Windows.
  • PostgreSQL là dự án mã nguồn mở nhấn mạnh khả năng mở rộng. Tính linh hoạt này khuyến khích đa dạng các hàm và toán tử về ngày có thể được tối ưu hoặc mở rộng bởi cộng đồng.
  • Oracle thường tập trung vào khả năng mở rộng cao và độ tin cậy cho ứng dụng doanh nghiệp, dẫn tới các tối ưu hóa cụ thể về cách xử lý ngày và các kiểu dữ liệu khác, thường chú trọng môi trường giao dịch phức tạp và khối lượng lớn.

Kết luận

Tôi khuyến khích bạn thực hành các kỹ năng khác nhau để biết khi nào áp dụng các hàm SQL trong những tình huống thực tế. Hãy cân nhắc tham gia các khóa SQL FundamentalsIntermediate SQL của DataCamp. Tôi cũng gợi ý khóa Associate Data Analyst in SQL cho các nhà phân tích và nhà khoa học dữ liệu tương lai để giúp bạn làm chủ nhiều kỹ thuật phân tích khác nhau. Những khóa này cũng sẽ giúp bạn chuẩn bị cho SQL Associate Certification, một chứng chỉ rất tốt cho hồ sơ xin việc. 


Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Biên tập viên kỹ thuật về Khoa học dữ liệu với kinh nghiệm thực tế trong phân tích dữ liệu, trí tuệ doanh nghiệp và khoa học dữ liệu. Tôi viết nội dung thực tiễn, tập trung vào ngành về SQL, Python, Power BI, Databricks và kỹ thuật dữ liệu, dựa trên công việc phân tích trong thế giới thực. Bài viết của tôi kết nối chiều sâu kỹ thuật với tác động kinh doanh, giúp các chuyên gia chuyển đổi dữ liệu thành những quyết định vững chắc.

Câu hỏi thường gặp

Toán tử so sánh là gì?

Các toán tử so sánh đối chiếu hai giá trị và trả về kết quả cho biết giá trị đó đúng hay sai so với giá trị được so sánh.

Các toán tử phổ biến dùng với giá trị ngày trong SQL là gì?

Các toán tử phổ biến dùng với giá trị ngày trong SQL bao gồm bằng (=), lớn hơn (>), nhỏ hơn (<), lớn hơn hoặc bằng (>=), nhỏ hơn hoặc bằng (<=).

Khi nào dùng toán tử BETWEEN trong SQL?

Toán tử BETWEEN được dùng để lọc các bản ghi trong một khoảng nhất định.

Tôi nên dùng toán tử nào nếu các ngày có giá trị NULL?

Bạn nên thêm mệnh đề IS NULL để xử lý giá trị null và tránh lỗi trong kết quả truy vấn.

Tôi nên làm gì nếu truy vấn SQL báo lỗi khi lọc giá trị ngày?

Hãy kiểm tra để đảm bảo các ngày của bạn đúng định dạng. Nếu không, hãy chuyển đổi chúng sang định dạng nhất quán như YYYY-MM-DD.

Chủ đề

Học SQL với DataCamp

Courses

Nhập môn SQL

2 giờ
1.6M
Học cách tạo và truy vấn cơ sở dữ liệu quan hệ bằng SQL chỉ trong hai giờ.
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow