MySQL-এ তারিখ যদি VARCHAR হিসেবে সংরক্ষিত থাকে (যেমন '06-19-2019'), তবে সেটি ডেট টাইপে রূপান্তর করে মাস বের করতে STR_TO_DATE() এবং MONTH() ফাংশন কম্বাইন করে ব্যবহার করা হয়।
টেবিল তৈরি এবং ডেটা ইনসার্ট
mysql> CREATE TABLE DemoTable (
-> DueDate VARCHAR(100)
-> );
Query OK, 0 rows affected (1.18 sec)
mysql> INSERT INTO DemoTable VALUES('06-19-2019');
mysql> INSERT INTO DemoTable VALUES('01-31-2018');
mysql> INSERT INTO DemoTable VALUES('12-01-2016');
সব রেকর্ড দেখানো
mysql> SELECT * FROM DemoTable;
আউটপুট
+------------+ | DueDate | +------------+ | 06-19-2019 | | 01-31-2018 | | 12-01-2016 | +------------+ 3 rows in set (0.00 sec)
মাস ০৬ (জুন) ফিল্টার করা
mysql> SELECT * FROM DemoTable
-> WHERE MONTH(STR_TO_DATE(DueDate, '%m-%d-%Y')) = 06;
আউটপুট
+------------+ | DueDate | +------------+ | 06-19-2019 | +------------+ 1 row in set (0.00 sec)
ব্যাখ্যা:
STR_TO_DATE(DueDate, '%m-%d-%Y')— স্ট্রিং '06-19-2019' কে ডেট টাইপে রূপান্তর করে (মাস-দিন-বছর ফরম্যাট অনুযায়ী)।MONTH(...)— ডেট থেকে মাস নম্বর বের করে (৬)।= 06— জুন মাসের রেকর্ড ফিল্টার করে।
পারফরম্যান্স সতর্কতা: কলামে ফাংশন (STR_TO_DATE, MONTH) লাগালে ইনডেক্স ব্যবহার হয় না (non-sargable)। বড় টেবিলে ধীর হবে।
সমাধান: আলাদা month কলাম রাখুন (জেনারেটেড কলাম বা ট্রিগার দিয়ে অটো পপুলেট), সেটিতে ইনডেক্স দিন। অথবা ডেটা ঠিক করুন: ALTER TABLE ... MODIFY DueDate DATE;।