Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Lọc bản ghi MySQL theo ngày hiện tại và ngày mai (CURDATE + INTERVAL)

Vấn đề: Truy vấn hàng có ShippingDate là hôm nay hoặc ngày mai

Cần lấy CustomerName cho các đơn hàng ship hôm nay (CURDATE()) hoặc ngày mai (CURDATE() + INTERVAL 1 DAY).

Giải pháp: WHERE ... IN (CURDATE(), CURDATE() + INTERVAL 1 DAY)

1. Lấy ngày hiện tại

SELECT CURDATE(); -- Ví dụ: 2019-12-15

2. Tạo bảng và dữ liệu

CREATE TABLE DemoTable (
    ProductId INT,
    ProductName VARCHAR(20),
    CustomerName VARCHAR(20),
    ShippingDate DATE
);

INSERT INTO DemoTable VALUES
(101, 'Product-1', 'Sam',    '2019-10-11'),
(102, 'Product-2', 'Carol',  '2018-12-01'),
(103, 'Product-3', 'David',  '2019-12-15'), -- Hôm nay
(104, 'Product-4', 'Robert', '2019-12-16'); -- Ngày mai

3. Truy vấn

SELECT CustomerName 
FROM DemoTable 
WHERE ShippingDate IN (CURDATE(), CURDATE() + INTERVAL 1 DAY);

4. Kết quả (giả sử hôm nay 2019-12-15)

+--------------+
| CustomerName |
+--------------+
| David        |
| Robert       |
+--------------+

Giải thích

  • CURDATE() – Trả về ngày hiện tại (DATE, không có thời gian).
  • CURDATE() + INTERVAL 1 DAY – Cộng 1 ngày (DATE arithmetic).
  • IN (val1, val2) – Khớp nếu ShippingDate bằng một trong hai giá trị.

Mở rộng: Khoảng ngày (Range)

WHERE ShippingDate >= CURDATE() 
  AND ShippingDate < CURDATE() + INTERVAL 2 DAY

Tương đương nhưng hiệu quả hơn với index (range scan).

Lưu ý múi giờ

  • CURDATE() dùng múi giờ của server MySQL.
  • Nếu ứng dụng đa múi giờ, cân nhắc lưu DATETIME UTC và chuyển đổi ở application layer.