- 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 3. වත්මන් දිනය/කාලය ප්රදර්ශන ආකාරය වෙනස් කිරීම
- 4 4. වත්මන් කාලය භාවිතා කර datetime ගණනය
- 4.1 4.1 INTERVAL සමඟ එකතු/ඉවත් කිරීම
- 4.2 4.2 පසුගිය 24 පැය වලින් දත්ත ලබා ගැනීම (ඉතා සාමාන්ය රටාව)
- 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 vs TIMESTAMP (වැදගත්)
- 6.4 6.4 CURRENT_TIMESTAMP DATETIME සමඟද භාවිතා කළ හැක
- 6.5 6.5 NOW() භාවිතා කිරීමට අවශ්ය නම්: විකල්පයක් (ට්රිගර්)
- 6.6 සුලබ සැලසුම් දෝෂ
- 6.7 මෙම කොටසෙන් ලබාගත් ප්රධාන ඉගෙනීම්
- 7 7. කාල කලාප සැලසුම් (UTC හි ගබඩා කරන්න, දේශීය කාලයේ පෙන්වන්න)
- 7.1 7.1 වර්තමාන කාල කලාපය පරීක්ෂා කරන්න
- 7.2 7.2 සැසියකට අනුව කාල කලාපය වෙනස් කරන්න
- 7.3 7.3 UTC හි ගබඩා කිරීමට හේතු (ප්රායෝගික මූලධර්මය)
- 7.4 7.4 CONVERT_TZ() සමඟ කාල කලාප සංක්රමණය කරන්න
- 7.5 7.5 CONVERT_TZ() NULL ආපසු ලබාදෙන්නේ ඇයි
- 7.6 7.6 සේවාදායක පුළුල් කාල කලාපය වෙනස් කරන්න
- 7.7 සුලබ දෝෂ
- 7.8 මෙම කොටසෙන් ලබාගත් ප්රධාන ඉගෙනීම්
- 8 8. ඔබට සෘජුව භාවිතා කළ හැකි ප්රායෝගික උදාහරණ
- 8.1 8.1 ලොග්වලට ස්වයංක්රීයව වර්තමාන කාලය ඇතුළු කරන්න
- 8.2 8.2 අවසන් ලොග්ඉන් කාලය යාවත්කාලීන කිරීම
- 8.3 8.3 කට්ටල (batch) රැකියා වල යොමු කාලය ස්ථිර කිරීම
- 8.4 8.4 අද / ඊයේ / පසුගිය 7 දින සඳහා එකතු කිරීම
- 8.5 8.5 කල් ඉකුත් වීමේ පරීක්ෂණ (සැසි/ටෝකන)
- 8.6 8.6 N පැය තුළ කල් ඉකුත් වන පේළි ලබා ගන්න
- 8.7 ඔබ සැමවිටම මතක තබා ගත යුතුය
- 8.8 මෙම කොටසෙන් ප්රධාන සාරාංශ
- 9 9. නිතර අසන ප්රශ්න (FAQ)
- 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()එකක් පමණක් භාවිතා කර fractional seconds ලබා ගත නොහැක.- ඔබේ තීරුවද නිරවද්යතාවය සඳහන් කළ යුතුය, උදා:
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();
Result (example):
2025-02-23 14:00:00
2025-02-23 14:00:00
SELECT SYSDATE(), SLEEP(2), SYSDATE();
Result (example):
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භාවිතා කරන්න.
3. වත්මන් දිනය/කාලය ප්රදර්ශන ආකාරය වෙනස් කිරීම
ඔබ NOW() සමඟ ලබා ගන්නා වත්මන් කාලය පෙරනිමි ලෙස YYYY-MM-DD HH:MM:SS ලෙස පෙන්වයි. සැබෑ වැඩකදී, ඔබට පහත වගේ අවශ්ය විය හැක:
- දිනය පමණක් පෙන්වන්න
YYYY/MM/DDභාවිතා කරන්න- ප්රාදේශීය ආකාරයක් භාවිතා කරන්න (උදා: Feb 23, 2025)
- මිලිසෙකන්ඩ් පෙන්වන්න
මෙයට, DATE_FORMAT() (datetime එකක් 任意 문자열 ආකාරයකට පරිවර්තනය කිරීම) භාවිතා කරන්න.
3.1 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 |
සටහන්
- සමහර නිරූපක උඩු/පහළ අකුරු අතර වෙනස් වේ.
%h12-පැය කාලය,%H24-පැය කාලය.
3.2 සාමාන්ය ආකාර උදාහරණ (සැබෑ වැඩකදී නිතර)
1. සළකුණු-වෙන් කළ
SELECT DATE_FORMAT(NOW(), '%Y/%m/%d');
2. ප්රාදේශීය (ඉංග්රීසි)
SELECT DATE_FORMAT(NOW(), '%b %d, %Y');
3. තත්පර නොමැති
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');
සාමාන්ය වැරදි
- එය string එකක් ලබා දෙන බැවින්, සංඛ්යාත්මක ගණනය සඳහා භාවිතා කළ නොහැක.
- සැසඳීම් සහ සෙවීම් සඳහා, මුල් DATETIME වර්ගය භාවිතා කළ යුතුය.
3.3 දිනය හෝ කාලය පමණක් ලබා ගැනීම
ඔබට වර්ගය රැකගෙන (string එකකට පරිවර්තනය කිරීම වෙනුවට) කොටස් ලබා ගත හැක.
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() |
3.4 මිලිසෙකන්ඩ් සමඟ පෙන්වීම
ඔබට ඉහළ නිරවද්ය ලොග් අවශ්ය වන විට:
SELECT NOW(6);
ආකාරය සමඟ:
SELECT DATE_FORMAT(NOW(6), '%Y-%m-%d %H:%i:%s.%f');
වැදගත් සටහන්
- ඔබේ තීරුව
DATETIME(6)හෝTIMESTAMP(6)විය යුතුය, නැතිනම් නිරවද්යතාව සුරැකෙන්නේ නැත. - MySQL 5.6.4 ට වඩා පරණ අනුවාද වල (පරිසරය අනුව) ලබා නොදේ.
සාමාන්ය වැරදි
DATE_FORMAT()ක්රියාකාරකම WHERE වාක්යයේ භාවිතා කිරීම ඉන්ඩෙක්ස් භාවිතය අහෝසි කරයි. wp:list /wp:list- නරක උදාහරණය:
WHERE DATE_FORMAT(created_at, '%Y-%m-%d') = '2025-02-23' - නිර්දේශිතය:
WHERE created_at >= '2025-02-23 00:00:00' AND created_at < '2025-02-24 00:00:00'
- නරක උදාහරණය:
- ප්රදර්ශන-ආකාරිත string එක සෘජුව සුරැකීම (සෙවීම් කාර්යක්ෂමතාවයට අඩුපාඩු).
මෙම කොටසෙන් ප්රධාන සාරාංශ
- ප්රදර්ශන ආකාර වෙනස් කිරීමට
DATE_FORMAT()භාවිතා කරන්න. - ගණනය/සැසඳීම් සඳහා, මුල් වර්ගය රැකගන්න.
- මිලිසෙකන්ඩ් අවශ්ය නම්, තීරුවේ නිර්වචනයේ නිරවද්යතාව සඳහන් කරන්න.
- WHERE වාක්යයේ ක්රියාකාරකම් භාවිතා කිරීම කාර්යක්ෂමතා ගැටළු ඇති කරයි.
4. වත්මන් කාලය භාවිතා කර datetime ගණනය
In MySQL, it’s common to calculate things like “N hours later,” “N days ago,” or “the past N days” based on the current time.
The most common real‑world case is “get data from the past 24 hours.”
The foundation of datetime arithmetic is INTERVAL (syntax for adding/subtracting time units).
4.1 INTERVAL සමඟ එකතු/ඉවත් කිරීම
1 පැය පසු ලබා ගන්න
SELECT NOW() + INTERVAL 1 HOUR;
3 දිනකට පෙර ලබා ගන්න
SELECT NOW() - INTERVAL 3 DAY;
1 මාසයක් පසු ලබා ගන්න
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කුඩා අකුරින්ද ක්රියා කරයි, නමුත් කණ්ඩායමේ තුළ ඒකරාශී කිරීම කළ යුතුය.- මාස අවසාන ගණනයන් අපේක්ෂා වලට අනුකූල නොවිය හැක, දින ගණන වෙනස් වීම නිසා (උදා: ජනවාරි 31 + 1 මාස).
4.2 පසුගිය 24 පැය වලින් දත්ත ලබා ගැනීම (ඉතා සාමාන්ය රටාව)
SELECT *
FROM users
WHERE created_at >= NOW() - INTERVAL 1 DAY;
අර්ථය
- “දැන් සිට පසුගිය 24 පැය දක්වා” යන අරමුණ.
සටහන්
- ඔබ
CURDATE()භාවිතා කළහොත්, මූලික බින්දුව “අද 00:00” වේ, එය අර්ථය වෙනස් කරයි.
උදාහරණය (අද දත්ත):
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');
සටහන්
- මාස අවසානය ස්ථිර දිනයක් නොවේ.
- පරාස විමසුම් සඳහා, “>= ආරම්භ AND < ඊළඟ මාසයේ පළමු දිනය” ආරක්ෂිත වේ.
සාමාන්ය දෝෂ සාරාංශය
- දිනය පමණක් ඇති අගයන් සමඟ
BETWEENභාවිතා කර වේලාව අමතක කිරීම - WHERE වාක්යවල
DATE(created_at)භාවිතා කිරීමෙන් ඉන්ඩෙක්ස් අක්රිය කිරීම - මාස ගණනයේ “31 වැනි දිනය” ගැටලුවෙන් වැසීම
NOW()සහCURDATE()අතර වෙනස්කම වැරදි ලෙස තේරුම් ගැනීම
මෙම කොටසෙන් ප්රධාන ග්රහණයන්
INTERVALයනු datetime ගණිතයේ පදනමයි.- පසුගිය 24 පැය =
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'
ඒ නිසා පෙබරවාරි 10 දින 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 පසුගිය 7 / පසුගිය 30 දින සඳහා ආරක්ෂිත රටා
පසුගිය 7 දින
WHERE created_at >= NOW() - INTERVAL 7 DAY;
පසුගිය 30 දින
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 vs 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 සහ පසු අනුව, ඔබට CURRENT_TIMESTAMP DATETIME තීරුවලට DEFAULT සහ ON UPDATE ලෙසද සකස් කළ හැක.
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භාවිතා කරන්න. - 2038 ගැටලුව සහ කාල කලාප හැසිරීම මත පදනම්ව වර්ග තෝරන්න.
- ඔබට නිරවද්යතාවය අවශ්ය නම්,
(6)අමතක නොකරන්න .
7. කාල කලාප සැලසුම් (UTC හි ගබඩා කරන්න, දේශීය කාලයේ පෙන්වන්න)
වර්තමාන කාලය සමඟ වැඩ කිරීමේදී, මඟහැරුණු කාල කලාප සැලසුම් වචන දළඛිලාව සහ දෙගුණ සංක්රමණය ඇති කරයි.
ප්රායෝගිකව, ආරක්ෂිතම අසම්පූර්ණය “UTC හි ගබඩා කරන්න, පෙන්වීම සඳහා දේශීය කාලයට සංක්රමණය කරන්න.”

රූපය: MySQL හි UTC ගබඩා කිරීම සහ දේශීය කාලය පෙන්වීම සඳහා මූලික ආකෘතිය
7.1 වර්තමාන කාල කලාපය පරීක්ෂා කරන්න
පළමුව, MySQL කුමන කාල කලාපයේ ධාවනය වේදැයි පරීක්ෂා කරන්න.
SELECT @@global.time_zone, @@session.time_zone;
@@global.time_zone→ සේවාදායක පුළුල් සැකසුම@@session.time_zone→ වර්තමාන සම්බන්ධතා/සැසිය සැකසුම- එය
SYSTEMපෙන්වන්නේ නම්, එය OS සැකසුම මත රඳා පවතී
සුලබ ගැටලු
- නිෂ්පාදන සහ සංවර්ධන සේවාදායකවල විවිධ OS කාල කලාප ඇත
- යෙදුම UTC වලට සංක්රමණය කරයි, සහ DB ආයෙත් සංක්රමණය කරයි (දෙගුණ සංක්රමණය)
7.2 සැසියකට අනුව කාල කලාපය වෙනස් කරන්න
SET time_zone = 'Asia/Tokyo';
හෝ UTC වලට ඒකාබද්ධ කරන්න:
SET time_zone = '+00:00';
ප්රධාන කරුණු
- සම්බන්ධතාවය වස වන විට එය ප්රතිවර්තනය වේ
- ඔබ සම්බන්ධතා පුල් භාවිතා කරන්නේ නම්, ඔබේ යෙදුම සැකසුම් පරීක්ෂා කරන්න
7.3 UTC හි ගබඩා කිරීමට හේතු (ප්රායෝගික මූලධර්මය)
අනුරූප සංකේතනය
- UTC හි දත්ත ගබඩා කරන්න
- පෙන්වීමේදී පරිශීලකගේ කාල කලාපයට සංක්රමණය කරන්න
හේතු:
- ජාත්යන්තර සහාය සඳහා පහසුයි
- දිවා ඉතිරි කාලය (DST) ගැටලු වළක්වන්න
- සේවාදායක ගලා යෑමේදී බලපෑම අවම කරන්න
UTC ලබාගන්න:
SELECT UTC_TIMESTAMP();
7.4 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;
7.5 CONVERT_TZ() NULL ආපසු ලබාදෙන්නේ ඇයි
එය NULL ආපසු ලබාදෙන්නේ නම්, සුලබ හේතු ඇතුළත් වේ:
- MySQL කාල කලාප වගු පූරණය නොකර ඇත
- විශේෂිත කාල කලාප නමක් පවතී නැත
ලිනක්ස්හි උදාහරණ පූරණය:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
සටහන්
- නිෂ්පාදනයේදී, අවසර සහ නැවත ආරම්භ කිරීම අවශ්යදැයි තහවුරු කරන්න
- Docker හි, රූපය මත රඳාව ඇතිව zoneinfo ඇතුළත් නොවිය හැක
7.6 සේවාදායක පුළුල් කාල කලාපය වෙනස් කරන්න
වින්යාස ගොනුව (my.cnf / my.ini):
[mysqld]
default_time_zone = '+00:00'
නැවත ආරම්භ කිරීමෙන් පසු තහවුරු කරන්න:
SELECT @@global.time_zone;
ප්රධාන
- නිෂ්පාදන වෙනස්කම් සඳහා, බලපෑමේ විෂය පථය තහවුරු කරන්න
- පවතින දත්ත සමඟ සැලකිලිමත් වන්න (කිලින්ම පෙන්වීමේ වෙනස්කම් පමණක්)
සුලබ දෝෂ
- UTC වෙනුවට දේශීය කාලය ගබඩා කිරීම, පසුව ජාත්යන්තර සහාය එකතු කිරීම
- යෙදුම සහ DB අතර දෙගුණ සංක්රමණය
- කාල කලාප සලකා නොබලා DATETIME සමඟ සැලසුම් කිරීම
- පරීක්ෂණ සහ නිෂ්පාදන අතර විවිධ TZ සැකසුම්
මෙම කොටසෙන් ලබාගත් ප්රධාන ඉගෙනීම්
- UTC හි ගබඩා කරන්න සහ පෙන්වීමේදී සංක්රමණය කරන්න.
UTC_TIMESTAMP()භාවිතා කරන්න .CONVERT_TZ()භාවිතා කිරීමේදී, TZ වගු තහවුරු කරන්න.- කාල කලාපවල පරිසර වෙනස්කම් සැමවිටම සලකා බලන්න.
8. ඔබට සෘජුව භාවිතා කළ හැකි ප්රායෝගික උදාහරණ
මෙන්න MySQL වර්තමාන කාලය සංවර්ධන/ක්රියාකාරකම්වල සැබෑ භාවිතය පෙන්වන ස්පච්චු SQL උදාහරණ.
ඒවා කොපි කර පේස්ට් කිරීමට ලියා ඇත.
8.1 ලොග්වලට ස්වයංක්රීයව වර්තමාන කාලය ඇතුළු කරන්න
වගුව සාදන්න
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ස්වයංක්රීයව ඇතුළත් වේ- යෙදුමෙන් කාල මුද්රාවක් ලබා දීමට අවශ්ය නැත
- තදබල පරීක්ෂණ සහ සිදුවීම් පරීක්ෂණ සඳහා අත්යවශ්ය සැලසුම
සාමාන්ය දෝෂයන්
- යෙදුම සහ දත්ත ගබඩාවේ (DB) කාලය කළමනාකරණය කිරීම
- එක්සත් නොවන කාල කලාප හේතුවෙන් කාල අසමතුලිතතා
8.2 අවසන් ලොග්ඉන් කාලය යාවත්කාලීන කිරීම
වගුවේ සැලසුම
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 ප්රකාශනවලින් අගය වෙනස් නොවිය හැකි අතර එමනිසා යාවත්කාලීන නොවේ
8.3 කට්ටල (batch) රැකියා වල යොමු කාලය ස්ථිර කිරීම
දිගු කාලීන ක්රියාවලීන් සඳහා, යොමු කාලයක් ස්ථිර කිරීම ආරක්ෂිත වේ.
SET @base_time = NOW();
SELECT *
FROM orders
WHERE created_at >= @base_time - INTERVAL 1 DAY;
ඇයි
- ක්රියාවලිය අතර කාලය වෙනස් නොවේ
- සමග්රතාව රැකගනී
8.4 අද / ඊයේ / පසුගිය 7 දින සඳහා එකතු කිරීම
අදේ විකුණුම්
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();
පසුගිය 7 දින
SELECT COUNT(*)
FROM users
WHERE created_at >= NOW() - INTERVAL 7 DAY;
වැදගත්
- WHERE වාක්යයේ තීරු වලට ක්රියාකාරකම් යෙදවන්න එපා
- ඉන්ඩෙක්ස් භාවිතා කළ හැකි ලෙස කොන්දේසි ලියන්න
8.5 කල් ඉකුත් වීමේ පරීක්ෂණ (සැසි/ටෝකන)
SELECT *
FROM sessions
WHERE expires_at > NOW();
කල් ඉකුත් වූ පේළි මකන්න
DELETE FROM sessions
WHERE expires_at <= NOW();
සාමාන්ය දෝෂයන්
CURDATE()භාවිතා කර කාලය නොසලකා හරිනවා- UTC සුරකිමින් දේශීය
NOW()සමඟ සැසඳීම
8.6 N පැය තුළ කල් ඉකුත් වන පේළි ලබා ගන්න
SELECT *
FROM coupons
WHERE expires_at <= NOW() + INTERVAL 1 HOUR;
භාවිතා කිරීමේ අවස්ථා:
- කල් ඉකුත් වීමේ ඇඟවීම්
- කල් ඉකුත් වීමේ දැනුම්දීම්
ඔබ සැමවිටම මතක තබා ගත යුතුය
- ඔබේ මූලික කාලය “දැන්”ද “අද 00:00”ද යන්න පැහැදිලිව සඳහන් කරන්න
- ඉන්ඩෙක්ස් ප්රභාවීව තබා ගැනීමට පූර්වක තීරක ලියන්න
- කාල කලාප සැලසුම මුලින්ම තීරණය කරන්න
- පැහැදිලි ප්රතිපත්තියක් නොමැතිව
NOW()සහUTC_TIMESTAMP()එකට මිශ්ර නොකරන්න
මෙම කොටසෙන් ප්රධාන සාරාංශ
- ලොග්/පරීක්ෂණ/යාවත්කාලීන නිරීක්ෂණ සඳහා
CURRENT_TIMESTAMPභාවිතා කරන්න - එකතු කිරීම සඳහා ආරක්ෂිත
>= AND <රටාව භාවිතා කරන්න - සැසි කළමනාකරණය සඳහා
NOW()සමඟ සැසඳන්න - ප්රකියාව සමගාමීව තබා ගැනීමට මූලික කාලයක් ස්ථිර කරන්න
9. නිතර අසන ප්රශ්න (FAQ)
MySQL වත්මන් කාලය පිළිබඳ සාමාන්ය ප්රශ්න මෙන්න, විශේෂයෙන් වාස්තුකාර්යයේ ඇතිවන ගැටළු.
9.1 NOW() සහ CURRENT_TIMESTAMP අතර වෙනස කුමක්ද?
නිගමනය: ආපසු ලැබෙන අගයේ අර්ථය එකම වේ.
SELECT NOW(), CURRENT_TIMESTAMP;
දෙකම වත්මන් දිනය-කාලය ලබා දෙයි.
ප්රධාන වෙනස ව්යාකරණ භාවිතයයි
CURRENT_TIMESTAMPDEFAULTසහON UPDATEතුළ භාවිතා කළ හැකNOW()DEFAULTතුළ සෘජුව භාවිතා කළ නොහැක
සටහන්
- එය වර්ග වෙනසක් නොවේ
(6)වැනි පරාමිතීන් සමඟ නිරවද්යතාවය නියම කළ හැක
9.2 ඔබ SYSDATE() භාවිතා කළ යුතුද?
SYSDATE() “ඇගයීමේ කාලය” හි කාලය ලබා දෙයි.
SELECT SYSDATE(), SLEEP(2), SYSDATE();
එම අගය එකම විමසුම තුළද වෙනස් විය හැක.
කොහොමද භාවිතා කළ යුතුද
- නියම වශයෙන් සැබෑ කාලය ලියා ගැනීමට අවශ්ය වන විට
කොහොමද වැළැක්විය යුතුද
- ප්රතිලේඛනය
- සමග්රතාව වැදගත් වන ගනුදෙනු සැකසීම
බොහෝ අවස්ථාවල, NOW() භාවිතා කිරීම ප්රමාණවත් වේ.
9.3 කාලය මාරු වන්නේ ඇයි?
Main causes:
- සේවාදායක වේලාව කලාප සැකසුම්
- සැසිය වේලාව කලාප සැකසුම්
- යෙදුම සමඟ ද්විත්ව පරිවර්තනය
- TIMESTAMP වර්ගයේ ස්වයංක්රීය පරිවර්තන හැසිරීම
Check with:
SELECT @@global.time_zone, @@session.time_zone;
නිවාරණය
- පෙරනිමි ලෙස UTC තුළ ගබඩා කරන්න
- පෙන්වීමේදී පමණක් පරිවර්තනය කරන්න
- යෙදුම සහ දත්ත ගබඩාව අතර ප්රතිපත්තිය ඒකාබද්ධ කරන්න
9.4 CONVERT_TZ() NULL ආපසු ලබා දෙයි
Causes:
- වේලාව කලාප වගු පූරණය කර නොමැත
- වැරදි වේලාව කලාප නාමය
Fix:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Docker පරිසරවල විශේෂයෙන් සැලකිලිමත් වන්න.
9.5 BETWEEN සමඟ පරාස මාරු
Bad:
WHERE created_at BETWEEN '2025-02-01' AND '2025-02-10';
Safe:
WHERE created_at >= '2025-02-01 00:00:00'
AND created_at < '2025-02-11 00:00:00';
Reasons:
- අවසන් සීමා වේලාවේ ගැටලුව
- මයික්රොසෙකන්ඩ් රැස්වීම
- දර්ශක කාර්යක්ෂමතාව
9.6 DATETIME සහ TIMESTAMP අතර තේරීම කෙසේද?
- ජාත්යන්තර සහය / UTC කළමනාකරණය → TIMESTAMP
- 2038 පසු හෝ ස්ථිර දිනය/වේලාව → DATETIME
මෙය නිර්මාණය කිරීමේදී තීරණය කරන්න.
9.7 මයික්රොසෙකන්ඩ් ගබඩා නොවේ
Cause:
- තීරුවේ නිර්වචනයේ නිරවද්යතාව සඳහන් කර නොමැත
Fix:
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 <” යනු සුදු රේඛාව
Safe pattern:
WHERE created_at >= 'START'
AND created_at < 'END'
Why:
- අවසන් සීමා පේළි අහිමි වීම වැලැක්වීම
- මයික්රොසෙකන්ඩ් සමඟ ක්රියා කරයි
- දර්ශක භාවිතා කළ හැකි තත්ත්වය රැකගනී
අවලංගු උදාහරණය
WHERE DATE(created_at) = CURDATE();
තීරුවක් ක්රියාකාරකමකින් වටා නොගන්න.
10.3 දිනය-වේලාව ගණිත මූලික
- එකතු/ඉවත් කිරීම →
INTERVAL - දින වෙනස්කම් →
DATEDIFF() - වේලාව වෙනස්කම් →
TIMESTAMPDIFF()
ඔබේ මූලිකය “now”ද “today 00:00”ද යන්න සැමවිටම මතක තබා ගන්න.
10.4 වේලාව කලාප නිර්මාණ නීති
- UTC තුළ ගබඩා කරන්න
- පෙන්වීමේදී පරිවර්තනය කරන්න
- යෙදුම සහ DB අතර ප්රතිපත්තිය ඒකාබද්ධ කරන්න
Check with:
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)ලෙස සඳහන් කරන්න
වාස්තුක ලෝකයේ 4 අති වැදගත් කරුණු
NOW()සහCURRENT_TIMESTAMPඅතර වෙනස වැරදි ලෙස නොබලන්න- පරාස විමසුම් සඳහා
>= AND <භාවිතා කරන්න - පෙරනිමි ලෙස UTC තුළ ගබඩා කරන්න
- වර්ග තීරණය (DATETIME vs TIMESTAMP) නිර්මාණයේදී කරන්න
MySQL වත්මන් වේලාව කළමනාකරණය ලොග් කිරීම, විකුණුම් එකතු කිරීම, සත්යාපන/සැසි කළමනාකරණය, කණ්ඩායම් රැකියා සහ අනෙකුත් සඳහා මූලික වේ. මෙම ලිපියේ නීති අනුගමනය කරන්නේ නම්, වේලාව දෝෂ, සීමා දෝෂ, සහ කාර්ය සාධන අඩු වීම වැනි පොදු ගැටළු බොහෝමයක් වැළැක්විය හැක.


