सिफारिश: पूर्ण DATETIME संग्रहीत करें, निकालें जब आवश्यक
MySQL में **केवल महीना और वर्ष** के लिए कोई अंतर्निहित डेटा प्रकार नहीं है। सर्वोत्तम अभ्यास: पूर्ण DATETIME (या DATE) संग्रहीत करें और क्वेरी के समय MONTH() और YEAR() से निकालें।
सिंटैक्स
SELECT MONTH(yourDateTimeColumn) AS MonthOnly,
YEAR(yourDateTimeColumn) AS YearOnly
FROM yourTableName;
व्यावहारिक उदाहरण
1. टेबल बनाएं
mysql> CREATE TABLE OnlyMonthAndYear (
-> DueDateTime DATETIME
-> );
Query OK, 0 rows affected (0.56 sec)
2. डेटा डालें
mysql> INSERT INTO OnlyMonthAndYear VALUES('2016-12-10');
mysql> INSERT INTO OnlyMonthAndYear VALUES('2017-10-21');
mysql> INSERT INTO OnlyMonthAndYear VALUES('2018-03-25');
mysql> INSERT INTO OnlyMonthAndYear VALUES('2018-12-18');
3. डेटा देखें
mysql> SELECT * FROM OnlyMonthAndYear;
+---------------------+
| DueDateTime |
+---------------------+
| 2016-12-10 00:00:00 |
| 2017-10-21 00:00:00 |
| 2018-03-25 00:00:00 |
| 2018-12-18 00:00:00 |
+---------------------+
4 rows in set (0.00 sec)
4. महीना और वर्ष निकालें
mysql> SELECT MONTH(DueDateTime) AS OnlyMonth, YEAR(DueDateTime) AS OnlyYear
-> FROM OnlyMonthAndYear;
+-----------+----------+
| OnlyMonth | OnlyYear |
+-----------+----------+
| 12 | 2016 |
| 10 | 2017 |
| 3 | 2018 |
| 12 | 2018 |
+-----------+----------+
4 rows in set (0.02 sec)
क्यों नहीं VARCHAR या INT?
| दृष्टिकोण | समस्या |
|---|---|
VARCHAR(7) 'YYYY-MM' | सॉर्टिंग, रेंज क्वेरी, गणना मुश्किल; सत्यापन नहीं |
INT YYYYMM | गणना जटिल (महीना रोलओवर); दिनांक फ़ंक्शन उपयोग नहीं कर सकते |
अलग कॉलम YEAR, MONTH | डेटा अखंडता नहीं (महीना 13 संभव); जॉइन/फिल्टर जटिल |
| DATETIME/DATE | **सभी दिनांक फ़ंक्शन, इंडेक्स, सत्यापन, सॉर्टिंग काम करते हैं** |
प्रदर्शन के लिए इंडेक्स
CREATE INDEX idx_due_year_month ON OnlyMonthAndYear (YEAR(DueDateTime), MONTH(DueDateTime));
MySQL 8.0+ फंक्शनल इंडेक्स समर्थन करता है।
सिर्फ प्रदर्शन के लिए फॉर्मेट करें
SELECT DATE_FORMAT(DueDateTime, '%Y-%m') AS YearMonth FROM OnlyMonthAndYear;
+----------+
| YearMonth|
+----------+
| 2016-12 |
| 2017-10 |
| 2018-03 |
| 2018-12 |
+----------+
निष्कर्ष: हमेशा DATE या DATETIME उपयोग करें। एप्लिकेशन/क्वेरी लेयर पर फॉर्मेट/निकालें।