वर्ष की परवाह किए बिना महीना-दिन रेंज द्वारा फ़िल्टर करना
यदि आप केवल महीना और दिन के आधार पर रिकॉर्ड फ़िल्टर करना चाहते हैं (जैसे "जनवरी 1 से मार्च 31 तक किसी भी वर्ष के"), तो DATE_FORMAT(date_col, '%m-%d') के साथ BETWEEN उपयोग करें।
टेबल और डेटा
CREATE TABLE ignoreYearDemo (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ShippingDate DATE
);
INSERT INTO ignoreYearDemo (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');
क्वेरी: जनवरी 1 से मार्च 31 तक (किसी भी वर्ष)
SELECT * FROM ignoreYearDemo WHERE DATE_FORMAT(ShippingDate, '%m-%d') BETWEEN '01-01' AND '03-31';
आउटपुट
+----+--------------+ | 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 | +----+--------------+
जून की तारीखें (06-23) बाहर रहीं।
महत्वपूर्ण विचार
- स्ट्रिंग तुलना:
'%m-%d'स्ट्रिंग तुलना करता है; यह '01-01' से '03-31' तक लेक्सिकोग्राफिकली काम करता है क्योंकि महीना और दिन दोनों शून्य-पैडेड हैं। - वर्ष-सीमा पार करने वाली रेंज: जैसे '12-01' से '01-31' — यह काम नहीं करेगा क्योंकि '12-01' > '01-31'। ऐसे मामले में
ORउपयोग करें:WHERE DATE_FORMAT(d, '%m-%d') >= '12-01' OR DATE_FORMAT(d, '%m-%d') <= '01-31'। - इंडेक्स उपयोग नहीं: फ़ंक्शन कॉल के कारण इंडेक्स उपयोग नहीं होगा। बड़े टेबल पर
MONTH()औरDAY()के साथ कम्पोजिट इंडेक्स या जनरेटेड कॉलम पर विचार करें।
वैकल्पिक: MONTH() और DAY()
SELECT * FROM ignoreYearDemo WHERE (MONTH(ShippingDate) = 1 AND DAY(ShippingDate) >= 1) OR (MONTH(ShippingDate) = 3 AND DAY(ShippingDate) <= 31) OR (MONTH(ShippingDate) = 2);