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

Kiểm tra ngày hiện tại có nằm trong khoảng ngày nào trong MySQL

Để kiểm tra xem ngày hiện tại (CURDATE()) có nằm trong khoảng [StartDate, EndDate] của từng hàng hay không, MySQL cho phép so sánh trực tiếp trong SELECT để trả về kết quả boolean (1 = true, 0 = false).

Ví dụ minh họa

Tạo bảng khoảng ngày:

mysql> CREATE TABLE DemoTable1448 (
    StartDate DATE,
    EndDate DATE
);

Chèn dữ liệu:

mysql> INSERT INTO DemoTable1448 VALUES ('2019-01-21', '2019-03-22');
mysql> INSERT INTO DemoTable1448 VALUES ('2019-04-05', '2019-10-10');
mysql> INSERT INTO DemoTable1448 VALUES ('2019-10-01', '2019-10-29');
mysql> INSERT INTO DemoTable1448 VALUES ('2018-12-31', '2019-12-31');

Dữ liệu:

mysql> SELECT * FROM DemoTable1448;
+------------+------------+
| StartDate  | EndDate    |
+------------+------------+
| 2019-01-21 | 2019-03-22 |
| 2019-04-05 | 2019-10-10 |
| 2019-10-01 | 2019-10-29 |
| 2018-12-31 | 2019-12-31 |
+------------+------------+

Giả sử hôm nay: 2019-10-05

Kiểm tra CURDATE() nằm trong khoảng

mysql> SELECT (CURDATE() >= StartDate AND CURDATE() <= EndDate) AS DateInRange 
    FROM DemoTable1448;

Kết quả (1 = có, 0 = không):

+-------------+
| DateInRange |
+-------------+
|           0 |
|           1 |
|           1 |
|           1 |
+-------------+

Giải thích

  • Hàng 1: 2019-10-05 không trong [2019-01-21, 2019-03-22] → 0.
  • Hàng 2: 2019-10-05 trong [2019-04-05, 2019-10-10] → 1.
  • Hàng 3: 2019-10-05 trong [2019-10-01, 2019-10-29] → 1.
  • Hàng 4: 2019-10-05 trong [2018-12-31, 2019-12-31] → 1.

Các biến thể hữu ích

Mục đíchCú pháp
Chỉ lấy hàng đang hiệu lựcWHERE CURDATE() BETWEEN StartDate AND EndDate
Hiển thị text thay vì 1/0SELECT IF(CURDATE() BETWEEN StartDate AND EndDate, 'Active', 'Inactive') AS Status FROM ...
Đếm số khoảng đang hiệu lựcSELECT COUNT(*) FROM DemoTable1448 WHERE CURDATE() BETWEEN StartDate AND EndDate
Kiểm tra datetime (có giờ)WHERE NOW() BETWEEN StartDateTime AND EndDateTime

Ứng dụng thực tế

  • Chương trình khuyến mãi / ưu đãi theo thời gian.
  • Hợp đồng, bảo hiểm, thuê bao có hiệu lực.
  • Ca làm việc, lịch sự kiện.
  • Feature flag theo ngày.

Hiệu năng

  • Tạo composite index trên (StartDate, EndDate) để tối ưu WHERE CURDATE() BETWEEN StartDate AND EndDate.
  • MySQL có thể dùng Index Range Scan nếu điều kiện selective.