Truy vấn theo khoảng ngày bỏ qua năm trong MySQL
Sử dụng DATE_FORMAT() kết hợp BETWEEN để so sánh chỉ phần tháng-ngày, bỏ qua năm.
Cú pháp
SELECT * FROM yourTable WHERE DATE_FORMAT(yourDateColumn, '%m-%d') BETWEEN 'start_mm-dd' AND 'end_mm-dd';
Ví dụ: Tìm đơn hàng giao từ 01-01 đến 03-31 (bất kỳ năm nào)
Tạo bảng:
mysql> CREATE TABLE igonreYearDemo (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ShippingDate DATE
-> );
Chèn dữ liệu nhiều năm:
mysql> INSERT INTO igonreYearDemo(ShippingDate) VALUES
('2016-01-31'), ('2018-01-31'), ('2015-06-23'), ('2015-06-23'),
('2014-02-01'), ('2019-01-31'), ('2019-02-14'), ('2019-03-12');
Dữ liệu:
+----+--------------+ | Id | ShippingDate | +----+--------------+ | 1 | 2016-01-31 | | 2 | 2018-01-31 | | 3 | 2015-06-23 | | 4 | 2015-06-23 | | 5 | 2014-02-01 | | 6 | 2019-01-31 | | 7 | 2019-02-14 | | 8 | 2019-03-12 | +----+--------------+
Truy vấn bỏ qua năm (01-01 đến 03-31):
mysql> SELECT * FROM igonreYearDemo tbl WHERE DATE_FORMAT(tbl.ShippingDate, '%m-%d') BETWEEN '01-01' AND '03-31';
Kết quả (6 hàng, loại bỏ 2 hàng tháng 6):
+----+--------------+ | Id | ShippingDate | +----+--------------+ | 1 | 2016-01-31 | | 2 | 2018-01-31 | | 5 | 2014-02-01 | | 6 | 2019-01-31 | | 7 | 2019-02-14 | | 8 | 2019-03-12 | +----+--------------+
Lưu ý hiệu năng
DATE_FORMAT()không sử dụng index trên cột date- Với bảng lớn, cân nhắc thêm cột
month_day VARCHAR(5)generated column có index - Hoặc dùng:
WHERE MONTH(date) BETWEEN 1 AND 3 AND DAY(date) BETWEEN 1 AND 31(cũng không dùng index)
Ứng dụng
- Báo cáo theo mùa vụ hàng năm
- Tìm sinh nhật trong khoảng ngày
- Phân tích xu hướng theo mùa