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

Kiểm tra NOW() có nằm giữa hai ngày cụ thể trong MySQL?

Giải pháp: BETWEEN với NOW()

Sử dụng NOW() BETWEEN start_date AND end_date để kiểm tra thời điểm hiện tại có trong khoảng.

Ví dụ minh họa

Tạo bảng khoảng thời gian

mysql> CREATE TABLE DemoTable (
    FirstDate DATETIME,
    SecondDate DATETIME
);

mysql> INSERT INTO DemoTable VALUES('2019-04-01', '2019-05-02');
mysql> INSERT INTO DemoTable VALUES('2019-05-28', '2019-06-04');
mysql> INSERT INTO DemoTable VALUES('2016-01-31', '2019-03-01');

Dữ liệu gốc

+-----------------------+-----------------------+
| FirstDate             | SecondDate            |
+-----------------------+-----------------------+
| 2019-04-01 00:00:00   | 2019-05-02 00:00:00   |
| 2019-05-28 00:00:00   | 2019-06-04 00:00:00   |
| 2016-01-31 00:00:00   | 2019-03-01 00:00:00   |
+-----------------------+-----------------------+

Giả sử NOW() = '2019-05-30 10:00:00'

Truy vấn

mysql> SELECT * FROM DemoTable 
    -> WHERE NOW() BETWEEN FirstDate AND SecondDate;

Kết quả

+-----------------------+-----------------------+
| FirstDate             | SecondDate            |
+-----------------------+-----------------------+
| 2019-05-28 00:00:00   | 2019-06-04 00:00:00   |
+-----------------------+-----------------------+

Giải thích

  • BETWEEN inclusive: FirstDate <= NOW() AND NOW() <= SecondDate
  • NOW() trả về DATETIME hiện tại (có giờ)
  • So sánh DATETIME với DATETIME: chính xác

Các biến thể

Cú phápDùng khi
NOW() BETWEEN start AND endCột DATETIME/TIMESTAMP
CURDATE() BETWEEN start AND endCột DATE (chỉ so sánh ngày)
DATE(NOW()) BETWEEN start AND endCột DATE, so sánh phần ngày
start <= NOW() AND NOW() <= endTường minh, dễ đọc hơn

Ứng dụng thực tế

Khuyến mãi đang hoạt động

SELECT * FROM promotions 
WHERE NOW() BETWEEN start_date AND end_date 
  AND status = 'active';

Ca làm việc hiện tại

SELECT * FROM shifts 
WHERE NOW() BETWEEN shift_start AND shift_end;

Hết hạn subscription

SELECT * FROM subscriptions 
WHERE NOW() > end_date AND status = 'active';

Lưu ý Timezone

  • NOW() trả về thời gian theo @@session.time_zone
  • Dữ liệu TIMESTAMP lưu UTC, chuyển đổi khi đọc
  • DATETIME lưu nguyên giá trị nhập (không chuyển timezone)
  • Đồng bộ timezone app và DB để tránh lệch