MySQL में DATE_SUB() और BETWEEN का उपयोग करके किसी दिनांक कॉलम में अंतिम N दिनों के रिकॉर्ड क्वेरी कर सकते हैं।
उदाहरण: पिछले 3 दिन पहले के पोस्ट (आधार दिनांक: 2019-10-20)
1. टेबल बनाएं
mysql> CREATE TABLE DemoTable1582 (PostedDate DATETIME);
2. डेटा डालें
mysql> INSERT INTO DemoTable1582 VALUES('2019-01-21 12:34:40');
mysql> INSERT INTO DemoTable1582 VALUES('2019-10-15 11:00:00');
mysql> INSERT INTO DemoTable1582 VALUES('2019-10-25 01:10:00');
3. क्वेरी (मूल लेख का दृष्टिकोण)
mysql> SELECT * FROM DemoTable1582
-> WHERE PostedDate BETWEEN DATE_SUB(PostedDate, INTERVAL 3 DAY) AND NOW();
4. परिणाम
+---------------------+ | PostedDate | +---------------------+ | 2019-01-21 12:34:40 | | 2019-10-15 11:00:00 | +---------------------+
⚠️ मूल क्वेरी में तार्किक समस्या
DATE_SUB(PostedDate, INTERVAL 3 DAY) प्रत्येक पंक्ति के अपने PostedDate से 3 दिन घटाता है, न कि एक निश्चित संदर्भ दिनांक से। यह "प्रत्येक पोस्ट के 3 दिन पहले से अब तक" ढूंढता है, जो लगभग सभी पिछली पंक्तियों से मेल खाता है।
सही दृष्टिकोण: निश्चित संदर्भ दिनांक
वर्तमान समय से पिछले 3 दिन
SELECT * FROM DemoTable1582 WHERE PostedDate BETWEEN DATE_SUB(NOW(), INTERVAL 3 DAY) AND NOW();
विशिष्ट दिनांक से पिछले 3 दिन
SELECT * FROM DemoTable1582
WHERE PostedDate BETWEEN DATE_SUB('2019-10-20', INTERVAL 3 DAY) AND '2019-10-20';
केवल पिछले 3 दिन (ऊपरी सीमा नहीं)
SELECT * FROM DemoTable1582 WHERE PostedDate >= DATE_SUB(NOW(), INTERVAL 3 DAY);
BETWEEN बनाम >= तुलना
| ऑपरेटर | शामिल | उपयोग |
|---|---|---|
| BETWEEN A AND B | A और B दोनों | सीमा क्वेरी |
| >= A | A से शुरू | "A के बाद" सरल |
इंडेक्स उपयोग के लिए सर्वोत्तम अभ्यास
-- अच्छा: कॉलम पर सीधा फ़ंक्शन नहीं WHERE PostedDate >= DATE_SUB(NOW(), INTERVAL 3 DAY) -- खराब: कॉलम पर फ़ंक्शन (इंडेक्स उपयोग नहीं) WHERE DATE(PostedDate) >= DATE_SUB(CURDATE(), INTERVAL 3 DAY)