- 1 1. MySQL-এ বর্তমান তারিখ/সময় পেতে সবচেয়ে সংক্ষিপ্ত SQL
- 1.1 1.1 বর্তমান তারিখ/সময় পান (মৌলিক)
- 1.2 1.2 শুধুমাত্র আজকের তারিখ পান
- 1.3 1.3 শুধুমাত্র বর্তমান সময় পান
- 1.4 1.4 UTC-তে বর্তমান সময় পান (গুরুত্বপূর্ণ)
- 1.5 1.5 মিলিসেকেন্ড / মাইক্রোসেকেন্ড পান
- 1.6 1.6 ব্যবহারিক ক্ষেত্রে সেরা ফাংশন (অনিশ্চিত হলে এখান থেকে শুরু করুন)
- 1.7 মানুষ প্রায়ই মিস করা মূল বিষয়গুলো
- 2 2. NOW() / CURRENT_TIMESTAMP / SYSDATE() এর পার্থক্য
- 3 ৩. বর্তমান তারিখ/সময়ের প্রদর্শন ফরম্যাট পরিবর্তন করুন
- 4 ৪. বর্তমান সময় ব্যবহার করে datetime গণনা
- 4.1 4.1 INTERVAL দিয়ে যোগ/বিয়োগ
- 4.2 4.2 গত ২৪ ঘন্টা থেকে ডেটা সংগ্রহ (সবচেয়ে সাধারণ প্যাটার্ন)
- 4.3 4.3 DATEDIFF() দিয়ে দিন পার্থক্য পাওয়া
- 4.4 4.4 ঘন্টা/মিনিট/সেকেন্ডের জন্য TIMESTAMPDIFF() ব্যবহার করুন
- 4.5 4.5 মাসের শুরু / মাসের শেষ পাওয়া (সাধারণ বাস্তবিক ফাঁদ)
- 4.6 সাধারণ ভুলের সারাংশ
- 4.7 এই অংশের মূল বিষয়গুলো
- 5 5. রেঞ্জ কুয়েরির জন্য, এটি BETWEEN এর চেয়ে নিরাপদ
- 6 6. DEFAULT CURRENT_TIMESTAMP এবং ON UPDATE (টেবিল ডিজাইন মৌলিক বিষয়)
- 6.1 6.1 created_at স্বয়ংক্রিয়ভাবে সেট করা (DEFAULT CURRENT_TIMESTAMP)
- 6.2 6.2 updated_at স্বয়ংক্রিয় আপডেট (ON UPDATE)
- 6.3 6.3 DATETIME বনাম TIMESTAMP (গুরুত্বপূর্ণ)
- 6.4 6.4 CURRENT_TIMESTAMP DATETIME-সাথে ব্যবহার করা যায়
- 6.5 6.5 যদি আপনি NOW() ব্যবহার করতে চান: একটি বিকল্প (ট্রিগার)
- 6.6 সাধারণ ডিজাইন ভুল
- 6.7 এই বিভাগের মূল নেয়া বিষয়সমূহ
- 7 ৭. টাইম জোন ডিজাইন (UTC তে সংরক্ষণ করুন, স্থানীয় সময়ে প্রদর্শন করুন)
- 7.1 ৭.১ বর্তমান টাইম জোন চেক করুন
- 7.2 ৭.২ সেশন প্রতি টাইম জোন পরিবর্তন করুন
- 7.3 ৭.৩ কেন UTC তে সংরক্ষণ করবেন (বাস্তব-বিশ্ব নীতি)
- 7.4 ৭.৪ CONVERT_TZ() দিয়ে টাইম জোন রূপান্তর করুন
- 7.5 ৭.৫ কেন CONVERT_TZ() NULL ফেরত দেয়
- 7.6 ৭.৬ সার্ভার-ব্যাপী টাইম জোন পরিবর্তন করুন
- 7.7 সাধারণ ভুল
- 7.8 এই বিভাগের মূল নেয়া বিষয়সমূহ
- 8 ৮. আপনি যেমন আছে তেমন ব্যবহার করতে পারেন এমন ব্যবহারিক উদাহরণসমূহ
- 8.1 ৮.১ লগে স্বয়ংক্রিয়ভাবে বর্তমান সময় ঢোকান
- 8.2 ৮.২ শেষ লগইন সময় আপডেট করুন
- 8.3 ৮.৩ ব্যাচ কাজগুলিতে রেফারেন্স সময় ঠিক করুন
- 8.4 ৮.৪ আজ / গতকাল / গত ৭ দিনের জন্য সমষ্টি
- 8.5 ৮.৫ মেয়াদ শেষ হওয়ার পরীক্ষা (সেশন/টোকেন)
- 8.6 ৮.৬ N ঘন্টার মধ্যে মেয়াদ শেষ হওয়া সারি পান
- 8.7 আপনাকে সর্বদা মনে রাখতে হবে
- 8.8 এই অংশের মূল বিষয়বস্তু
- 9 ৯. প্রায়শই জিজ্ঞাসিত প্রশ্ন (FAQ)
- 9.1 ৯.১ NOW() এবং CURRENT_TIMESTAMP এর মধ্যে পার্থক্য কী?
- 9.2 ৯.২ আপনি কি SYSDATE() ব্যবহার করবেন?
- 9.3 ৯.৩ সময় কেন পরিবর্তিত হয়?
- 9.4 9.4 CONVERT_TZ() NULL ফেরত দেয়
- 9.5 9.5 BETWEEN দিয়ে রেঞ্জ শিফট
- 9.6 9.6 DATETIME এবং TIMESTAMP এর মধ্যে কীভাবে নির্বাচন করবেন?
- 9.7 9.7 মাইক্রোসেকেন্ড সংরক্ষণ হচ্ছে না
- 9.8 এই অংশের মূল বিষয়গুলো
- 10 10. সারাংশ
1. MySQL-এ বর্তমান তারিখ/সময় পেতে সবচেয়ে সংক্ষিপ্ত SQL
যদি আপনি MySQL-এ বর্তমান তারিখ/সময় পেতে চান, প্রথমে মনে রাখার জন্য ফাংশনগুলো হল NOW() এবং CURRENT_TIMESTAMP। নিচে ব্যবহারিক ক্ষেত্রে সবচেয়ে সংক্ষিপ্ত SQL উদাহরণগুলো দেওয়া হয়েছে।
1.1 বর্তমান তারিখ/সময় পান (মৌলিক)
SELECT NOW();
or
SELECT CURRENT_TIMESTAMP;
- উভয়ই বর্তমান তারিখ/সময় (YYYY-MM-DD HH:MM:SS) প্রদান করে।
- একই কুয়েরির মধ্যে, সময়টি “কুয়েরি শুরু সময়” এ স্থির থাকে।
ব্যবহারিক ক্ষেত্রসমূহ
- লগিং
- রেকর্ড তৈরির টাইমস্ট্যাম্প পাওয়া
- রেফারেন্স সময় পাওয়া
সাধারণ ভুল
- অ্যাপের টাইম জোন এবং ডাটাবেসের টাইম জোন ভিন্ন এবং “সময় শিফট” হয়। →
SELECT @@session.time_zone;দিয়ে পরীক্ষা করুন।
1.2 শুধুমাত্র আজকের তারিখ পান
SELECT CURDATE();
- রিটার্ন ফরম্যাট:
YYYY-MM-DD - টাইপ হল DATE (শুধুমাত্র তারিখ, datetime নয়)
ব্যবহারিক ক্ষেত্রসমূহ
- “আজকের ডেটা” অনুসন্ধান
- দৈনিক সমষ্টি
নোটস
NOW()এর বিপরীতে, এতে সময় অন্তর্ভুক্ত নয়।- রেঞ্জ কুয়েরির জন্য সময় দরকার হলে,
NOW()ব্যবহার করুন।
1.3 শুধুমাত্র বর্তমান সময় পান
SELECT CURTIME();
- রিটার্ন ফরম্যাট:
HH:MM:SS - টাইপ হল TIME (শুধুমাত্র সময়)
ব্যবহারিক ক্ষেত্রসমূহ
- ব্যাচ এক্সিকিউশন সময় প্রদর্শন
- লগে শুধুমাত্র সময় অংশ মুদ্রণ
সাধারণ ফাঁদ
- যেহেতু এতে তারিখ নেই, datetime তুলনার জন্য এটি ব্যবহার করা যায় না।
1.4 UTC-তে বর্তমান সময় পান (গুরুত্বপূর্ণ)
SELECT UTC_TIMESTAMP();
- সার্ভারের টাইম জোন যাই হোক না কেন, UTC রিটার্ন করে।
- গ্লোবাল সার্ভিসের জন্য সুপারিশকৃত।
বাস্তব প্রকল্পে মৌলিক নীতি
- UTC-তে সংরক্ষণ করুন
- প্রদর্শনের সময় লোকাল সময়ে রূপান্তর করুন
নোটস
- যদি অ্যাপ ইতিমধ্যে UTC-তে রূপান্তর করে, দ্বিগুণ রূপান্তর থেকে সতর্ক থাকুন।
1.5 মিলিসেকেন্ড / মাইক্রোসেকেন্ড পান
SELECT NOW(3); -- milliseconds (3 digits after the decimal point)
SELECT NOW(6); -- microseconds (6 digits after the decimal point)
- MySQL 5.6.4 এবং পরের সংস্করণে উপলব্ধ।
- উচ্চ-নির্ভুলতার লগ এবং ট্রানজ্যাকশন অডিটের জন্য ব্যবহৃত।
সাধারণ ভুল ধারণা
- শুধুমাত্র
NOW()ভগ্নাংশ সেকেন্ড রিটার্ন করতে পারে না। - আপনার কলামটিকেও নির্ভুলতা নির্ধারণ করতে হবে, উদাহরণস্বরূপ
DATETIME(6)।
1.6 ব্যবহারিক ক্ষেত্রে সেরা ফাংশন (অনিশ্চিত হলে এখান থেকে শুরু করুন)
| Use case | Recommended function |
|---|---|
| General current datetime | NOW() |
| Table default value | CURRENT_TIMESTAMP |
| Date only | CURDATE() |
| Time only | CURTIME() |
| Unified UTC management | UTC_TIMESTAMP() |
| High-precision logs | NOW(6) |
মানুষ প্রায়ই মিস করা মূল বিষয়গুলো
NOW()এবংCURRENT_TIMESTAMPকার্যত সমতুল্য (একই মান)।- একই কুয়েরির মধ্যে, সময় স্থির থাকে।
- প্রদর্শিত মান টাইম জোন সেটিংসের উপর নির্ভর করে পরিবর্তিত হয়।
- মাইক্রোসেকেন্ডের জন্য, আপনার কলাম ডেফিনিশনে নির্ভুলতা উল্লেখ থাকতে হবে।
2. NOW() / CURRENT_TIMESTAMP / SYSDATE() এর পার্থক্য
বর্তমান সময় পেতে একাধিক ফাংশন আছে, তবে সবচেয়ে বিভ্রান্তিকর অংশ হল NOW(), CURRENT_TIMESTAMP, এবং SYSDATE() এর পার্থক্য। যদি আপনি এটি সঠিকভাবে না বুঝেন, লগ এবং ট্রানজ্যাকশন প্রক্রিয়ায় অপ্রত্যাশিত আচরণ ঘটতে পারে।
2.1 NOW() এবং CURRENT_TIMESTAMP কার্যত সমতুল্য
SELECT NOW(), CURRENT_TIMESTAMP;
- উভয়ই বর্তমান datetime (একটি DATETIME মান) রিটার্ন করে।
- একই কুয়েরির মধ্যে, সময় “কুয়েরি শুরু সময়” এ স্থির থাকে।
CURRENT_TIMESTAMPফাংশন-কল সিনট্যাক্সে ব্যবহার করা যায়:SELECT CURRENT_TIMESTAMP();
বাস্তব প্রকল্পে কীভাবে নির্বাচন করবেন
| Use case | Recommended |
|---|---|
| Simple retrieval | NOW() |
| Table DEFAULT / ON UPDATE | CURRENT_TIMESTAMP |
গুরুত্বপূর্ণ পয়েন্টগুলো
- প্রাপ্ত মানের অর্থ একই।
- প্রধান পার্থক্য হল সিনট্যাক্স/ব্যবহার (যেমন, DEFAULT-এ অনুমোদিত)।
- এটি টাইপের পার্থক্য নয় (বুঝতে সহজে ভুল হতে পারে)।
2.2 SYSDATE() “মূল্যায়ন সময়ে” সময় রিটার্ন করে
SYSDATE() NOW() এর মতো দেখায়, তবে মানটি কখন স্থির হয় তার সময় ভিন্ন।
SELECT NOW(), SLEEP(2), NOW();
ফলাফল (উদাহরণ):
2025-02-23 14:00:00
2025-02-23 14:00:00
SELECT SYSDATE(), SLEEP(2), SYSDATE();
ফলাফল (উদাহরণ):
2025-02-23 14:00:00
2025-02-23 14:00:02
মূল পার্থক্য
| Function | When the time is fixed |
|---|---|
NOW() | Query start time |
SYSDATE() | Evaluation time |
2.3 লেনদেন এবং রেপ্লিকেশনের জন্য নোটস
NOW() কুয়েরি শুরুতে স্থির থাকে, তাই
লেনদেনের মধ্যে একটি সঙ্গত রেফারেন্স সময়ের প্রয়োজন হলে এটি নিরাপদ।
অন্যদিকে, SYSDATE() কার্যকর করার সময়ের উপর নির্ভরশীল হওয়ায়, এটি পুনরুত্পাদনযোগ্যতাকে প্রভাবিত করতে পারে নিম্নলিখিত ক্ষেত্রে:
- রেপ্লিকেশন
- ব্যাচ কাজ
- বৃহৎ লগ প্রক্রিয়াকরণ
সাধারণ নির্দেশিকা
- স্থির রেফারেন্স সময় চাইলে →
NOW() - প্রতিবার সঠিক মুহূর্ত দরকার হলে →
SYSDATE()(সীমিত ব্যবহার)
2.4 নোট: CURRENT_DATE / CURRENT_TIME / LOCALTIME
MySQL এছাড়াও সমর্থন করে:
SELECT CURRENT_DATE;
SELECT CURRENT_TIME;
SELECT LOCALTIME;
CURRENT_DATE→CURDATE()এর সমানCURRENT_TIME→CURTIME()এর সমানLOCALTIME→NOW()এর সমান
সাধারণ বিভ্রান্তি
- এগুলো মূলত “সৌন্দর্যগত পার্থক্য”; কার্যকরী পার্থক্য খুব কম।
- নিরাপত্তার জন্য, পাঠযোগ্যতাকে অগ্রাধিকার দিন এবং প্রকল্পের মধ্যে মানকরণ করুন।
এই অংশের মূল বিষয়গুলো
NOW()এবংCURRENT_TIMESTAMPমূলত একই অর্থ বহন করে।SYSDATE()ভিন্নভাবে কাজ করে কারণ এটি মূল্যায়নের সময়ের উপর ভিত্তি করে।- স্থির রেফারেন্স সময়ের জন্য, ডিফল্ট হিসেবে
NOW()ব্যবহার করুন। - DEFAULT এবং ON UPDATE এর জন্য
CURRENT_TIMESTAMPব্যবহার করুন।
৩. বর্তমান তারিখ/সময়ের প্রদর্শন ফরম্যাট পরিবর্তন করুন
NOW() দিয়ে প্রাপ্ত বর্তমান সময় ডিফল্টভাবে YYYY-MM-DD HH:MM:SS হিসেবে প্রদর্শিত হয়। বাস্তব কাজের ক্ষেত্রে, আপনি প্রায়ই নিম্নলিখিত প্রয়োজন করবেন:
- শুধুমাত্র তারিখ দেখান
YYYY/MM/DDব্যবহার করুন- একটি লোকালাইজড ফরম্যাট ব্যবহার করুন (যেমন, Feb 23, 2025)
- মিলিসেকেন্ড দেখান
এর জন্য, ব্যবহার করুন DATE_FORMAT() (একটি datetime কে 任意 স্ট্রিং ফরম্যাটে রূপান্তর করে)।
৩.১ DATE_FORMAT() এর মৌলিক সিনট্যাক্স
DATE_FORMAT(datetime, 'format_string')
উদাহরণ: বর্তমান সময়কে YYYY/MM/DD HH:MM এ রূপান্তর করুন
SELECT DATE_FORMAT(NOW(), '%Y/%m/%d %H:%i');
আউটপুট উদাহরণ:
2025/02/23 14:35
সাধারণ ফরম্যাট স্পেসিফায়ার
| Specifier | Meaning | Example |
|---|---|---|
%Y | 4-digit year | 2025 |
%m | 2-digit month | 02 |
%d | 2-digit day | 23 |
%H | Hour (24-hour) | 14 |
%i | Minutes | 35 |
%s | Seconds | 50 |
%f | Microseconds | 123456 |
নোটস
- কিছু স্পেসিফায়ার বড়হাতের/ছোটহাতের মধ্যে পার্থক্য থাকে।
%hহল 12-ঘণ্টা সময়,%Hহল 24-ঘণ্টা সময়।
৩.২ সাধারণ ফরম্যাট উদাহরণ (বাস্তব কাজের মধ্যে প্রায়ই ব্যবহৃত)
১. স্ল্যাশ-সেপারেটেড
SELECT DATE_FORMAT(NOW(), '%Y/%m/%d');
২. লোকালাইজড (ইংরেজি)
SELECT DATE_FORMAT(NOW(), '%b %d, %Y');
৩. সেকেন্ড ছাড়া
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');
সাধারণ ভুল
- এটি একটি স্ট্রিং রিটার্ন করে, তাই সংখ্যাত্মক গণনার জন্য ব্যবহার করা যায় না।
- তুলনা এবং অনুসন্ধানের জন্য, মূল DATETIME টাইপ ব্যবহার করা উচিত।
৩.৩ শুধুমাত্র তারিখ বা সময় অংশ বের করুন
আপনি টাইপটি বজায় রেখে অংশগুলো পুনরুদ্ধার করতে পারেন (স্ট্রিংয়ে ফরম্যাট করার পরিবর্তে)।
SELECT DATE(NOW()); -- date only (DATE type)
SELECT TIME(NOW()); -- time only (TIME type)
SELECT YEAR(NOW()); -- year only
SELECT MONTH(NOW()); -- month only
SELECT DAY(NOW()); -- day only
প্রস্তাবিত ব্যবহার
| Goal | Recommended |
|---|---|
| Formatting for display | DATE_FORMAT |
| Calculation / comparison | DATE() / TIME() |
৩.৪ মাইক্রোসেকেন্ড সহ প্রদর্শন
যখন আপনাকে উচ্চ-নির্ভুলতার লগ দরকার:
SELECT NOW(6);
ফরম্যাটিং সহ:
SELECT DATE_FORMAT(NOW(6), '%Y-%m-%d %H:%i:%s.%f');
গুরুত্বপূর্ণ নোটস
- আপনার কলামটি
DATETIME(6)অথবাTIMESTAMP(6)হতে হবে, না হলে নির্ভুলতা সংরক্ষিত হবে না। - MySQL সংস্করণ 5.6.4 এর চেয়ে পুরোনো হলে এটি উপলব্ধ নয় (পরিবেশ-নির্ভর)।
সাধারণ ভুল
WHERE ক্লজে
DATE_FORMAT()ব্যবহার করলে ইনডেক্স ব্যবহার করা যায় না। wp:list /wp:list- Bad example:
WHERE DATE_FORMAT(created_at, '%Y-%m-%d') = '2025-02-23' - Recommended:
WHERE created_at >= '2025-02-23 00:00:00' AND created_at < '2025-02-24 00:00:00' - প্রদর্শন-ফরম্যাটেড স্ট্রিং সরাসরি সংরক্ষণ করা (অনুসন্ধান পারফরম্যান্স ক্ষতি করে)
- Bad example:
এই অংশের মূল বিষয়গুলো
- প্রদর্শন ফরম্যাট পরিবর্তনের জন্য
DATE_FORMAT()ব্যবহার করুন। - গণনা/তুলনার জন্য মূল টাইপ বজায় রাখুন।
- যদি মাইক্রোসেকেন্ড দরকার হয়, কলাম সংজ্ঞায় নির্ভুলতা নির্দিষ্ট করুন।
- WHERE ক্লজে ফাংশন ব্যবহার করলে পারফরম্যান্স সমস্যার সৃষ্টি হতে পারে।
৪. বর্তমান সময় ব্যবহার করে datetime গণনা
In MySQL, এটি সাধারণ যে বর্তমান সময়ের উপর ভিত্তি করে “N ঘন্টা পরে”, “N দিন আগে”, অথবা “গত N দিন” ইত্যাদি গণনা করা হয়।
সবচেয়ে সাধারণ বাস্তবিক উদাহরণ হল “গত ২৪ ঘন্টা থেকে ডেটা সংগ্রহ করা।”
datetime গাণিতিকের ভিত্তি হল INTERVAL (সময় একক যোগ/বিয়োগের সিনট্যাক্স)।
4.1 INTERVAL দিয়ে যোগ/বিয়োগ
১ ঘন্টা পরে
SELECT NOW() + INTERVAL 1 HOUR;
৩ দিন আগে
SELECT NOW() - INTERVAL 3 DAY;
১ মাস পরে
SELECT NOW() + INTERVAL 1 MONTH;
সাধারণ এককসমূহ
| Unit | Meaning |
|---|---|
| SECOND | Seconds |
| MINUTE | Minutes |
| HOUR | Hours |
| DAY | Days |
| WEEK | Weeks |
| MONTH | Months |
| YEAR | Years |
সাধারণ ভুলগুলো
INTERVAL 1 DAY-এDAYছোটহরফে লিখলেও কাজ করে, তবে টিমের মধ্যে স্ট্যান্ডার্ডাইজ করা উচিত।- মাসের শেষের গণনা প্রত্যাশার থেকে ভিন্ন হতে পারে কারণ দিনের সংখ্যা পরিবর্তনশীল (যেমন, জানুয়ারি ৩১ + ১ মাস)।
4.2 গত ২৪ ঘন্টা থেকে ডেটা সংগ্রহ (সবচেয়ে সাধারণ প্যাটার্ন)
SELECT *
FROM users
WHERE created_at >= NOW() - INTERVAL 1 DAY;
অর্থ
- “এখন থেকে ২৪ ঘন্টা আগে পর্যন্ত” লক্ষ্য করে।
নোট
- যদি আপনি
CURDATE()ব্যবহার করেন, তবে ভিত্তি “আজ ০০:০০” হয়ে যায়, যা অর্থ পরিবর্তন করে।
উদাহরণ (আজকের ডেটা):
SELECT *
FROM users
WHERE created_at >= CURDATE();
পার্থক্য বোঝা গুরুত্বপূর্ণ
| Expression | Meaning |
|---|---|
NOW() - INTERVAL 1 DAY | Past 24 hours |
CURDATE() | Since today 00:00 |
4.3 DATEDIFF() দিয়ে দিন পার্থক্য পাওয়া
SELECT DATEDIFF('2025-03-01', '2025-02-23');
ফলাফল:
6
- একক হল “দিন”
- সময়ের অংশ উপেক্ষা করা হয়
নোট
- আর্গুমেন্টের ক্রমের উপর নির্ভর করে চিহ্ন পরিবর্তিত হয়।
- ঘন্টা/মিনিট/সেকেন্ডে পার্থক্য গণনা করা যায় না।
4.4 ঘন্টা/মিনিট/সেকেন্ডের জন্য TIMESTAMPDIFF() ব্যবহার করুন
SELECT TIMESTAMPDIFF(HOUR,
'2025-02-23 12:00:00',
'2025-02-23 18:30:00');
ফলাফল:
6
মিনিট
SELECT TIMESTAMPDIFF(MINUTE,
'2025-02-23 12:00:00',
'2025-02-23 12:30:00');
সেকেন্ড
SELECT TIMESTAMPDIFF(SECOND,
'2025-02-23 12:00:00',
'2025-02-23 12:00:45');
ব্যবহারিক উদাহরণ
- সেশন সময়কাল গণনা
- মেয়াদ শেষ হওয়া পরীক্ষা
- টাইমআউট সিদ্ধান্ত
4.5 মাসের শুরু / মাসের শেষ পাওয়া (সাধারণ বাস্তবিক ফাঁদ)
এই মাসের প্রথম দিন পান:
SELECT DATE_FORMAT(NOW(), '%Y-%m-01');
পরবর্তী মাসের প্রথম দিন:
SELECT DATE_FORMAT(NOW() + INTERVAL 1 MONTH, '%Y-%m-01');
নোট
- মাসের শেষ একটি নির্দিষ্ট তারিখ নয়।
- রেঞ্জ কুয়েরির জন্য, “>= start AND < next month’s first day” নিরাপদ।
সাধারণ ভুলের সারাংশ
- তারিখ-শুধু মানের সঙ্গে
BETWEENব্যবহার করা এবং সময় ভুলে যাওয়া - WHERE ক্লজে
DATE(created_at)ব্যবহার করে ইনডেক্স নিষ্ক্রিয় করা - মাসের গণনায় “৩১তম দিন” সমস্যায় ফাঁদে পড়া
NOW()এবংCURDATE()এর পার্থক্য ভুল বোঝা
এই অংশের মূল বিষয়গুলো
INTERVALহল datetime গাণিতিকের ভিত্তি।- গত ২৪ ঘন্টা =
NOW() - INTERVAL 1 DAY। - দিন =
DATEDIFF(); ছোট এককগুলো =TIMESTAMPDIFF()। - মাস-ভিত্তিক গণনার শেষ শর্তে সতর্ক থাকুন।
5. রেঞ্জ কুয়েরির জন্য, এটি BETWEEN এর চেয়ে নিরাপদ
MySQL-এ তারিখ রেঞ্জ অনুসন্ধান করার সময়, অনেক নবীন BETWEEN ব্যবহার করে। তবে, যদি আপনি সময় সীমা সঠিকভাবে পরিচালনা না করেন তবে এটি প্রায়শই অনিচ্ছাকৃত ফলাফল দেয়, তাই বাস্তব কাজের ক্ষেত্রে একটি নিরাপদ প্যাটার্ন সুপারিশ করা হয়।
5.1 BETWEEN এর মৌলিক বিষয় এবং ফাঁদ
একটি সাধারণ কুয়েরি
SELECT *
FROM orders
WHERE order_date BETWEEN '2025-02-01' AND '2025-02-10';
দেখতে ঠিক আছে, তবে অভ্যন্তরীণভাবে এটি সমতুল্য:
WHERE order_date >= '2025-02-01 00:00:00'
AND order_date <= '2025-02-10 00:00:00'
সুতরাং এটি ফেব্রুয়ারি ১০ তারিখের ০০:০০ এর পরে ডেটা অন্তর্ভুক্ত করে না।
5.2 নিরাপদ প্যাটার্ন (সুপারিশকৃত)
সুপারিশকৃত প্যাটার্ন
SELECT *
FROM orders
WHERE order_date >= '2025-02-01 00:00:00'
AND order_date < '2025-02-11 00:00:00';
মূল বিষয়গুলো
- শেষ সীমা নির্ধারণ করুন “পরের দিন 00:00 এর চেয়ে কম”
<= 23:59:59এর চেয়ে নিরাপদ (মাইক্রোসেকেন্ড সমর্থন করে)
5.3 আজকের ডেটা পাওয়ার সঠিক পদ্ধতি
খারাপ উদাহরণ:
WHERE DATE(created_at) = CURDATE();
সমস্যা:
- কলামের উপর ফাংশন প্রয়োগ করলে ইন্ডেক্স নিষ্ক্রিয় হয়
- বড় টেবিলগুলিতে গুরুতর ধীরগতি ঘটাতে পারে
প্রস্তাবিত:
WHERE created_at >= CURDATE()
AND created_at < CURDATE() + INTERVAL 1 DAY;
এটি নিশ্চিত করে:
- ইন্ডেক্স ব্যবহার করা যাবে
- দ্রুত অনুসন্ধান
- সীমা সংক্রান্ত কোনো সমস্যা নেই
5.4 গত ৭ দিন / গত ৩০ দিনের জন্য নিরাপদ প্যাটার্ন
গত ৭ দিন
WHERE created_at >= NOW() - INTERVAL 7 DAY;
গত ৩০ দিন
WHERE created_at >= NOW() - INTERVAL 30 DAY;
নোট
CURDATE() - INTERVAL 7 DAY“আজ 00:00” ভিত্তিকNOW() - INTERVAL 7 DAY“বর্তমান সময়” ভিত্তিক- প্রয়োজন অনুসারে নির্বাচন করুন
5.5 ইন্ডেক্স কার্যকর রাখতে মূল নিয়ম
খারাপ:
WHERE DATE(created_at) = '2025-02-23';
ভাল:
WHERE created_at >= '2025-02-23 00:00:00'
AND created_at < '2025-02-24 00:00:00';
কেন:
- ইন্ডেক্স “কলাম নিজেই” তে কাজ করে
- ফাংশন প্রয়োগ করলে ইন্ডেক্স ব্যবহার রোধ হয় (পূর্ণ স্ক্যান)
সাধারণ ভুলের সারাংশ
BETWEEN-এ শেষ সীমায় সময় অন্তর্ভুক্ত করতে ভুলে যাওয়া23:59:59ব্যবহার করার সময় মাইক্রোসেকেন্ড বাদ পড়াWHEREক্লজেDATE()ব্যবহার করে কুয়েরি ধীর করা- “now” এবং “today 00:00” এর মধ্যে অস্পষ্টতা রাখা
এই অংশের মূল টেকঅ্যাওয়ে
- রেঞ্জ কুয়েরি সবচেয়ে নিরাপদ
>= start AND < endদিয়ে। BETWEEN-এ সীমা সতর্কতার সাথে পরিচালনা প্রয়োজন।- ইন্ডেক্স কার্যকর রাখতে, কলামকে ফাংশনে মোড়ানো উচিত নয়।
NOW()-ভিত্তিক এবংCURDATE()-ভিত্তিক লজিক স্পষ্টভাবে নির্বাচন করুন।
6. DEFAULT CURRENT_TIMESTAMP এবং ON UPDATE (টেবিল ডিজাইন মৌলিক বিষয়)
ডাটাবেস ডিজাইনে, created_at এবং updated_at স্বয়ংক্রিয়ভাবে পরিচালনা করা সাধারণ। MySQL-এ, CURRENT_TIMESTAMP ইনসার্ট এবং আপডেটের সময় বর্তমান সময় স্বয়ংক্রিয়ভাবে সেট করতে দেয়।
6.1 created_at স্বয়ংক্রিয়ভাবে সেট করা (DEFAULT CURRENT_TIMESTAMP)
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
আচরণ:
INSERT INTO users (name) VALUES ('Alice');
→ বর্তমান সময় স্বয়ংক্রিয়ভাবে created_at-এ সন্নিবেশিত হয়।
মূল পয়েন্টসমূহ
CURRENT_TIMESTAMPDEFAULT-এ ব্যবহার করা যায়।NOW()সরাসরি DEFAULT-এ ব্যবহার করা যায় না।
সাধারণ ভুল
created_at DATETIME DEFAULT NOW(); -- error
কারণ:
- MySQL-এ, সাধারণত আপনি কোনো ফাংশনকে DEFAULT হিসেবে সেট করতে পারেন না (ব্যতিক্রম হল CURRENT_TIMESTAMP)।
6.2 updated_at স্বয়ংক্রিয় আপডেট (ON UPDATE)
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
);
আচরণ:
UPDATE users SET name = 'Bob' WHERE id = 1;
→ updated_at স্বয়ংক্রিয়ভাবে বর্তমান সময়ে আপডেট হয়।
ব্যবহার ক্ষেত্রসমূহ
- শেষ লগইন ট্র্যাকিং
- আপডেট ইতিহাস
- অডিট লগ
6.3 DATETIME বনাম TIMESTAMP (গুরুত্বপূর্ণ)
| Type | Range | Time zone impact |
|---|---|---|
| DATETIME | Year 1000 to 9999 | No |
| TIMESTAMP | 1970 to 2038 | Yes |
মূল পার্থক্য
TIMESTAMPঅভ্যন্তরীণভাবে UTC-তে সংরক্ষিত হয় এবং প্রদর্শনের সময় সেশন টাইম জোনে রূপান্তরিত হয়।DATETIMEলিটারাল মান সংরক্ষণ করে (কোনো রূপান্তর নয়)।
নির্দেশিকা
| Case | Recommended type |
|---|---|
| Log management | TIMESTAMP |
| Future dates (after 2038) | DATETIME |
| Fixed values not requiring TZ conversion | DATETIME |
6.4 CURRENT_TIMESTAMP DATETIME-সাথে ব্যবহার করা যায়
MySQL 5.6 এবং পরের সংস্করণে, আপনি DATETIME কলামের জন্যও DEFAULT এবং ON UPDATE-এ CURRENT_TIMESTAMP নির্ধারণ করতে পারেন।
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
নোট
- পুরনো MySQL সংস্করণে সীমাবদ্ধতা রয়েছে (পরিবেশ-নির্ভর)।
- যদি আপনাকে নির্ভুলতা দরকার হয়:
DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6)
6.5 যদি আপনি NOW() ব্যবহার করতে চান: একটি বিকল্প (ট্রিগার)
CREATE TRIGGER set_created_at
BEFORE INSERT ON logs
FOR EACH ROW
SET NEW.created_at = NOW();
ব্যবহার ক্ষেত্রসমূহ
- জটিল প্রাথমিক মান যুক্তি
- শর্তসাপেক্ষ টাইমস্ট্যাম্প বরাদ্দ
নোটস
- ট্রিগারগুলো ডিবাগ করা কঠিন।
- প্রয়োজন না হলে এড়িয়ে চলুন।
সাধারণ ডিজাইন ভুল
created_atএবংupdated_atউভয়টিতে ON UPDATE যোগ করা- DATETIME এবং TIMESTAMP আচরণ বিভ্রান্তিকর
- টাইম জোন সিদ্ধান্ত স্থগিত করা
এই বিভাগের মূল নেয়া বিষয়সমূহ
- DEFAULT এর জন্য
CURRENT_TIMESTAMPব্যবহার করুন। - আপডেট ট্র্যাকিংয়ের জন্য
ON UPDATE CURRENT_TIMESTAMPব্যবহার করুন। - টাইম জোন আচরণ এবং ২০৩৮ সমস্যার উপর ভিত্তি করে ধরন নির্বাচন করুন।
- যদি নির্ভুলতা প্রয়োজন হয়, (৬) ভুলবেন না ।
৭. টাইম জোন ডিজাইন (UTC তে সংরক্ষণ করুন, স্থানীয় সময়ে প্রদর্শন করুন)
বর্তমান সময় নিয়ে কাজ করার সময়, খারাপ টাইম জোন ডিজাইন সময় ড্রিফট এবং দ্বিগুণ রূপান্তর ঘটায়।
বাস্তবে, সবচেয়ে নিরাপদ ডিফল্ট হলো “UTC তে সংরক্ষণ করুন, প্রদর্শনের জন্য স্থানীয় সময়ে রূপান্তর করুন।”

চিত্র: MySQL তে UTC সংরক্ষণ এবং স্থানীয় সময় প্রদর্শনের জন্য মৌলিক স্থাপত্য
৭.১ বর্তমান টাইম জোন চেক করুন
প্রথমে, চেক করুন MySQL কোন টাইম জোনে চলছে।
SELECT @@global.time_zone, @@session.time_zone;
@@global.time_zone→ সার্ভার-ব্যাপী সেটিং@@session.time_zone→ বর্তমান সংযোগ/সেশন সেটিং- যদি এটি
SYSTEMদেখায়, তাহলে এটি OS সেটিংয়ের উপর নির্ভর করে
সাধারণ সমস্যা
- প্রোডাকশন এবং ডেভেলপমেন্ট সার্ভারের ভিন্ন OS টাইম জোন
- অ্যাপ UTC তে রূপান্তর করে, এবং DB আবার রূপান্তর করে (দ্বিগুণ রূপান্তর)
৭.২ সেশন প্রতি টাইম জোন পরিবর্তন করুন
SET time_zone = 'Asia/Tokyo';
বা UTC তে একত্রিত করুন:
SET time_zone = '+00:00';
গুরুত্বপূর্ণ বিষয়
- সংযোগ বন্ধ হলে এটি পূর্বাবস্থায় ফিরে যায়
- যদি আপনি সংযোগ পুলিং ব্যবহার করেন, আপনার অ্যাপ্লিকেশন সেটিং চেক করুন
৭.৩ কেন UTC তে সংরক্ষণ করবেন (বাস্তব-বিশ্ব নীতি)
সুপারিশিত নীতি
- UTC তে ডেটা সংরক্ষণ করুন
- প্রদর্শনের সময় ব্যবহারকারীর টাইম জোনে রূপান্তর করুন
কারণ:
- সহজ আন্তর্জাতিক সমর্থন
- ডেলাইট সেভিং টাইম (DST) সমস্যা এড়ান
- সার্ভার স্থানান্তরের সময় প্রভাব কমান
UTC পান:
SELECT UTC_TIMESTAMP();
৭.৪ CONVERT_TZ() দিয়ে টাইম জোন রূপান্তর করুন
উদাহরণ: UTC → JST
SELECT CONVERT_TZ('2025-02-23 05:35:00', '+00:00', '+09:00');
টাইম জোন নাম ব্যবহার করে:
SELECT CONVERT_TZ('2025-02-23 05:35:00', 'UTC', 'Asia/Tokyo');
বাস্তব-বিশ্ব উদাহরণ
SELECT CONVERT_TZ(created_at, 'UTC', 'Asia/Tokyo')
FROM users;
৭.৫ কেন CONVERT_TZ() NULL ফেরত দেয়
যদি এটি NULL ফেরত দেয়, সাধারণ কারণসমূহ অন্তর্ভুক্ত:
- MySQL টাইম জোন টেবিল লোড করা হয়নি
- নির্দিষ্ট টাইম জোন নাম বিদ্যমান নেই
লিনাক্সে লোডের উদাহরণ:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
নোটস
- প্রোডাকশনে, অনুমতি নিশ্চিত করুন এবং রিস্টার্ট প্রয়োজন কিনা তা যাচাই করুন
- ডকারে, ইমেজের উপর নির্ভর করে zoneinfo অন্তর্ভুক্ত নাও হতে পারে
৭.৬ সার্ভার-ব্যাপী টাইম জোন পরিবর্তন করুন
কনফিগ ফাইল (my.cnf / my.ini):
[mysqld]
default_time_zone = '+00:00'
রিস্টার্টের পর যাচাই করুন:
SELECT @@global.time_zone;
গুরুত্বপূর্ণ
- প্রোডাকশন পরিবর্তনের জন্য, প্রভাবের পরিধি নিশ্চিত করুন
- বিদ্যমান ডেটার সাথে সতর্ক থাকুন (কখনও কখনও শুধুমাত্র প্রদর্শন পরিবর্তন)
সাধারণ ভুল
- UTC এর পরিবর্তে স্থানীয় সময় সংরক্ষণ করে, পরে আন্তর্জাতিক সমর্থন যোগ করা
- অ্যাপ এবং DB এর মধ্যে দ্বিগুণ রূপান্তর
- টাইম জোন বিবেচনা না করে DATETIME দিয়ে ডিজাইন করা
- টেস্ট এবং প্রোডাকশনের মধ্যে ভিন্ন TZ সেটিং
এই বিভাগের মূল নেয়া বিষয়সমূহ
- UTC তে সংরক্ষণ করুন এবং প্রদর্শনে রূপান্তর করুন।
UTC_TIMESTAMP()ব্যবহার করুন।CONVERT_TZ()ব্যবহার করার সময়, TZ টেবিল যাচাই করুন।- টাইম জোনে পরিবেশের পার্থক্য সর্বদা বিবেচনা করুন।
৮. আপনি যেমন আছে তেমন ব্যবহার করতে পারেন এমন ব্যবহারিক উদাহরণসমূহ
এখানে কংক্রিট SQL উদাহরণসমূহ রয়েছে যা দেখায় কীভাবে বাস্তব ডেভেলপমেন্ট/অপারেশনে MySQL বর্তমান সময় ব্যবহার করবেন।
এগুলো লেখা হয়েছে যাতে আপনি সরাসরি কপি এবং পেস্ট করতে পারেন।
৮.১ লগে স্বয়ংক্রিয়ভাবে বর্তমান সময় ঢোকান
টেবিল তৈরি করুন
CREATE TABLE system_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
level VARCHAR(50),
message TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
লগ সন্নিবেশ করুন
INSERT INTO system_logs (level, message)
VALUES ('ERROR', 'Failed to connect to the DB');
মূল বিষয়বস্তু
created_atস্বয়ংক্রিয়ভাবে সন্নিবেশিত হয়- অ্যাপ থেকে টাইমস্ট্যাম্প পাঠানোর প্রয়োজন নেই
- অডিটিং এবং ঘটনা তদন্তের জন্য অপরিহার্য নকশা
সাধারণ ভুলগুলো
- অ্যাপ এবং ডেটাবেস উভয়েই সময় পরিচালনা করা
- একীভূত নয় এমন সময় অঞ্চলগুলির কারণে সময়ের অসঙ্গতি
৮.২ শেষ লগইন সময় আপডেট করুন
টেবিল নকশা
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255),
last_login TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
);
লগইন সময় আপডেট করুন
UPDATE users
SET last_login = NOW()
WHERE id = 1;
দ্রষ্টব্য
ON UPDATEশুধুমাত্র কলাম পরিবর্তিত হলে সক্রিয় হয়- কিছু UPDATE স্টেটমেন্ট মান পরিবর্তন না করলে আপডেট হয় না
৮.৩ ব্যাচ কাজগুলিতে রেফারেন্স সময় ঠিক করুন
দীর্ঘস্থায়ী প্রক্রিয়ার জন্য, রেফারেন্স সময় স্থির করা নিরাপদ।
SET @base_time = NOW();
SELECT *
FROM orders
WHERE created_at >= @base_time - INTERVAL 1 DAY;
কেন
- প্রক্রিয়ার মাঝখানে সময় পরিবর্তন হয় না
- সামঞ্জস্য বজায় থাকে
৮.৪ আজ / গতকাল / গত ৭ দিনের জন্য সমষ্টি
আজকের বিক্রয়
SELECT SUM(amount)
FROM orders
WHERE created_at >= CURDATE()
AND created_at < CURDATE() + INTERVAL 1 DAY;
গতকালের বিক্রয়
SELECT SUM(amount)
FROM orders
WHERE created_at >= CURDATE() - INTERVAL 1 DAY
AND created_at < CURDATE();
গত ৭ দিন
SELECT COUNT(*)
FROM users
WHERE created_at >= NOW() - INTERVAL 7 DAY;
গুরুত্বপূর্ণ
- WHERE ক্লজে কলামগুলিতে ফাংশন প্রয়োগ করবেন না
- ইন্ডেক্স ব্যবহারযোগ্য রাখতে শর্ত লিখুন
৮.৫ মেয়াদ শেষ হওয়ার পরীক্ষা (সেশন/টোকেন)
SELECT *
FROM sessions
WHERE expires_at > NOW();
মেয়াদ শেষ হওয়া সারি মুছুন
DELETE FROM sessions
WHERE expires_at <= NOW();
সাধারণ ভুলগুলো
CURDATE()ব্যবহার করে সময় উপেক্ষা করা- UTC সংরক্ষণ করে স্থানীয়
NOW()দিয়ে তুলনা করা
৮.৬ N ঘন্টার মধ্যে মেয়াদ শেষ হওয়া সারি পান
SELECT *
FROM coupons
WHERE expires_at <= NOW() + INTERVAL 1 HOUR;
ব্যবহার ক্ষেত্র:
- মেয়াদ শেষ হওয়ার সতর্কতা
- মেয়াদ শেষ হওয়ার নোটিফিকেশন
আপনাকে সর্বদা মনে রাখতে হবে
- আপনার বেসলাইন “এখন” না “আজ ০০:০০” তা স্পষ্টভাবে উল্লেখ করুন
- ইন্ডেক্স কার্যকর রাখতে প্রেডিকেট লিখুন
- শুরুতেই সময় অঞ্চল নকশা নির্ধারণ করুন
- স্পষ্ট নীতি ছাড়া
NOW()এবংUTC_TIMESTAMP()মিশ্রণ করবেন না
এই অংশের মূল বিষয়বস্তু
- লগ/অডিট/আপডেট ট্র্যাকিংয়ের জন্য
CURRENT_TIMESTAMPব্যবহার করুন - সমষ্টির জন্য নিরাপদ
>= AND <প্যাটার্ন ব্যবহার করুন - সেশন ব্যবস্থাপনার জন্য
NOW()দিয়ে তুলনা করুন - প্রক্রিয়ার সামঞ্জস্য বজায় রাখতে বেসলাইন সময় নির্ধারণ করুন
৯. প্রায়শই জিজ্ঞাসিত প্রশ্ন (FAQ)
এখানে MySQL বর্তমান সময় সম্পর্কে সাধারণ প্রশ্নগুলো রয়েছে, বিশেষ করে বাস্তব কাজের সময় যে সমস্যাগুলো দেখা দেয়।
৯.১ NOW() এবং CURRENT_TIMESTAMP এর মধ্যে পার্থক্য কী?
উপসংহার: ফেরত পাওয়া মানের অর্থ একই।
SELECT NOW(), CURRENT_TIMESTAMP;
উভয়ই বর্তমান তারিখ ও সময় ফেরত দেয়।
প্রধান পার্থক্য হল সিনট্যাক্সিক ব্যবহার
CURRENT_TIMESTAMPDEFAULTএবংON UPDATE-এ ব্যবহার করা যায়NOW()সরাসরিDEFAULT-এ ব্যবহার করা যায় না
দ্রষ্টব্য
- এটি টাইপের পার্থক্য নয়
(6)এর মতো আর্গুমেন্ট দিয়ে নির্ভুলতা নির্ধারণ করা যায়
৯.২ আপনি কি SYSDATE() ব্যবহার করবেন?
SYSDATE() “মূল্যায়ন সময়ে” সময় ফেরত দেয়।
SELECT SYSDATE(), SLEEP(2), SYSDATE();
একই কুয়েরির মধ্যে মান পরিবর্তিত হতে পারে।
কবে ব্যবহার করবেন
- যখন আপনাকে সঠিক বাস্তব সময় রেকর্ড করতে হবে
কবে এড়িয়ে চলবেন
- প্রতিলিপি
- যেখানে সামঞ্জস্য গুরুত্বপূর্ণ এমন লেনদেন প্রক্রিয়া
বেশিরভাগ ক্ষেত্রে, NOW() ব্যবহার যথেষ্ট।
৯.৩ সময় কেন পরিবর্তিত হয়?
প্রধান কারণগুলো:
- সার্ভার সময় অঞ্চল সেটিংস
- সেশন সময় অঞ্চল সেটিংস
- অ্যাপ্লিকেশনের সাথে দ্বিগুণ রূপান্তর
- TIMESTAMP টাইপের স্বয়ংক্রিয় রূপান্তর আচরণ
পরীক্ষা করুন:
SELECT @@global.time_zone, @@session.time_zone;
শমন
- ডিফল্টভাবে UTC-তে সংরক্ষণ করুন
- শুধুমাত্র প্রদর্শনের সময় রূপান্তর করুন
- অ্যাপ ও ডেটাবেসের মধ্যে নীতি একীভূত করুন
9.4 CONVERT_TZ() NULL ফেরত দেয়
কারণগুলো:
- সময় অঞ্চল টেবিল লোড করা হয়নি
- ভুল সময় অঞ্চল নাম
সমাধান:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Docker পরিবেশে বিশেষভাবে সতর্ক থাকুন।
9.5 BETWEEN দিয়ে রেঞ্জ শিফট
খারাপ:
WHERE created_at BETWEEN '2025-02-01' AND '2025-02-10';
নিরাপদ:
WHERE created_at >= '2025-02-01 00:00:00'
AND created_at < '2025-02-11 00:00:00';
কারণগুলো:
- শেষ সীমার সময় সমস্যাঃ
- মাইক্রোসেকেন্ড লিকেজ
- সূচকের কার্যকারিতা
9.6 DATETIME এবং TIMESTAMP এর মধ্যে কীভাবে নির্বাচন করবেন?
- আন্তর্জাতিক সমর্থন / UTC ব্যবস্থাপনা → TIMESTAMP
- 2038 সালের পর বা স্থির datetime → DATETIME
ডিজাইন পর্যায়ে এটি নির্ধারণ করুন।
9.7 মাইক্রোসেকেন্ড সংরক্ষণ হচ্ছে না
কারণ:
- কলাম সংজ্ঞায় কোনো নির্ভুলতা নির্ধারিত হয়নি
সমাধান:
created_at DATETIME(6)
এই অংশের মূল বিষয়গুলো
NOW()এবংCURRENT_TIMESTAMPদিয়ে শুরু করুন- রেঞ্জ কুয়েরির জন্য
>= AND <ব্যবহার করুন - UTC-তে সংরক্ষণ করা সবচেয়ে নিরাপদ ডিফল্ট
- টাইপ নির্বাচন এবং নির্ভুলতা ভুলবেন না
10. সারাংশ
এই প্রবন্ধে MySQL-এ বর্তমান সময় পুনরুদ্ধার, ফরম্যাট, গণনা এবং পরিচালনার ব্যবহারিক পদ্ধতিগুলি সংগঠিত করা হয়েছে।
অবশেষে, এখানে রয়েছে নিরাপদ থাকতে আপনার জানা প্রয়োজনীয় ন্যূনতম মূল বিষয়গুলো।
10.1 বর্তমান সময় পাওয়া (মৌলিক বিষয়গুলো)
- সাধারণ পুনরুদ্ধার →
NOW() - টেবিলের DEFAULT / আপডেট ট্র্যাকিং →
CURRENT_TIMESTAMP - শুধুমাত্র তারিখ →
CURDATE() - শুধুমাত্র সময় →
CURTIME() - UTC →
UTC_TIMESTAMP() - উচ্চ নির্ভুলতা →
NOW(6)
সাধারণ নির্দেশিকা
- যদি নিশ্চিত না হন, বেশিরভাগ ক্ষেত্রে
NOW()ব্যবহার করা ঠিক আছে। - স্কিমা ডিজাইনের জন্য
CURRENT_TIMESTAMPব্যবহার করুন।
10.2 রেঞ্জ কুয়েরি: “>= AND <” হল সোনার নিয়ম
নিরাপদ প্যাটার্ন:
WHERE created_at >= 'START'
AND created_at < 'END'
কেন:
- শেষ সীমার রো মিস হওয়া রোধ করে
- মাইক্রোসেকেন্ডের সাথে কাজ করে
- সূচকগুলো ব্যবহারযোগ্য রাখে
খারাপ উদাহরণ
WHERE DATE(created_at) = CURDATE();
কলামকে ফাংশনে মোড়ানো যাবে না।
10.3 datetime গাণিতিক মৌলিক বিষয়গুলো
- যোগ/বিয়োগ →
INTERVAL - দিন পার্থক্য →
DATEDIFF() - সময় পার্থক্য →
TIMESTAMPDIFF()
সর্বদা মনে রাখবেন আপনার বেসলাইন “now” না “today 00:00”।
10.4 সময় অঞ্চল ডিজাইন নীতি
- UTC-তে সংরক্ষণ করুন
- প্রদর্শনের সময় রূপান্তর করুন
- অ্যাপ ও ডেটাবেসের মধ্যে নীতি একীভূত করুন
পরীক্ষা করুন:
SELECT @@global.time_zone, @@session.time_zone;
10.5 টেবিল ডিজাইন সেরা অনুশীলন
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
- অডিটিং/লগিং/আপডেট ট্র্যাকিংয়ের জন্য স্ট্যান্ডার্ড সরঞ্জাম
- যদি নির্ভুলতা দরকার হয়,
(6)নির্ধারণ করুন
বাস্তব জগতে সবচেয়ে গুরুত্বপূর্ণ ৪টি পয়েন্ট
NOW()এবংCURRENT_TIMESTAMPএর পার্থক্য ভুলভাবে বোঝবেন না- রেঞ্জ কুয়েরির জন্য
>= AND <ব্যবহার করুন - ডিফল্টভাবে UTC-তে সংরক্ষণ করুন
- ডিজাইন পর্যায়ে টাইপ (DATETIME বনাম TIMESTAMP) নির্ধারণ করুন
MySQL-এ বর্তমান সময়ের হ্যান্ডলিং লগিং, বিক্রয় সমষ্টিকরণ, প্রমাণীকরণ/সেশন ব্যবস্থাপনা, ব্যাচ কাজ এবং আরও অনেক কিছুর জন্য মৌলিক।
যদি আপনি এই প্রবন্ধের নীতিগুলি অনুসরণ করেন, তবে সময়ের বিচ্যুতি, সীমা বাগ এবং পারফরম্যান্স হ্রাসের মতো সাধারণ সমস্যাগুলি এড়াতে পারবেন।


