বছরের কথা না কয়েক নির্দিষ্ট মাস-দিনের রেঞ্জের (যেমন ১ জানুয়ারি থেকে ৩১ মার্চ) ডেটা ফিল্টার করতে DATE_FORMAT() ব্যবহার করে মাস-দিন অংশ বের করুন।
সিনট্যাক্স
SELECT * FROM table_name
WHERE DATE_FORMAT(date_column, '%m-%d') BETWEEN '01-01' AND '03-31';
উদাহরণ
CREATE TABLE ignore_year_demo (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
shipping_date DATE
);
INSERT INTO ignore_year_demo (shipping_date) 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');
ক্যোয়ারি: ১ জানুয়ারি থেকে ৩১ মার্চ পর্যন্ত (বছর নির্বিশেষে)
SELECT * FROM ignore_year_demo
WHERE DATE_FORMAT(shipping_date, '%m-%d') BETWEEN '01-01' AND '03-31';
ফলাফল
+----+--------------+
| id | shipping_date|
+----+--------------+
| 1 | 2016-01-31 |
| 2 | 2018-01-31 |
| 5 | 2014-02-01 |
| 6 | 2019-01-31 |
| 7 | 2019-02-14 |
| 8 | 2019-03-12 |
+----+--------------+
২০১৫-০৬-২৩ এবং ২০১৫-০৬-২৩ বাদ পড়েছে কারণ জুন (০৬) রেঞ্জের বাইরে।
উন্নত পদ্ধতি: স্ট্রিং কম্পারিশন এড়াতে (পারফরম্যান্স)
-- স্ট্রিং কম্পারিশন ইনডেক্স ব্যবহার করে না
WHERE DATE_FORMAT(shipping_date, '%m-%d') BETWEEN '01-01' AND '03-31'
-- ভালো: DAYOFYEAR ব্যবহার করুন (১-৩৬৬)
WHERE DAYOFYEAR(shipping_date) BETWEEN 1 AND 90 -- ৩১ মার্চ = ৯০তম দিন (লিপ ইয়ারে ৯১)
লিপ ইয়ার হ্যান্ডলিং
-- ১ জানুয়ারি থেকে ২৮ ফেব্রুয়ারি (লিপ ইয়ার নির্বিশেষে নিরাপদ)
WHERE DATE_FORMAT(shipping_date, '%m-%d') BETWEEN '01-01' AND '02-28'
-- অথবা মাস ও দিন আলাদা করে
WHERE (MONTH(shipping_date) = 1)
OR (MONTH(shipping_date) = 2 AND DAY(shipping_date) <= 28)
OR (MONTH(shipping_date) = 3 AND DAY(shipping_date) <= 31)
ইনডেক্সিং টিপ
DATE_FORMAT() বা DAYOFYEAR() ফাংশন কলামে ব্যবহার করলে ইনডেক্স ব্যবহার হয় না। বড় টেবিলের জন্য:
-- জেনারেটেড কলাম + ইনডেক্স (MySQL 5.7+)
ALTER TABLE ignore_year_demo
ADD COLUMN day_of_year SMALLINT GENERATED ALWAYS AS (DAYOFYEAR(shipping_date)) STORED,
ADD INDEX idx_doy (day_of_year);
-- ক্যোয়ারি
SELECT * FROM ignore_year_demo WHERE day_of_year BETWEEN 1 AND 90;