ការបោះពុម្ភអត្ថបទនេះត្រូវបានអនុញ្ញាតតែជាមួយតំណភ្ជាប់ទៅកាន់គេហទំព័ររបស់អ្នកនិពន្ធអត្ថបទប៉ុណ្ណោះ។
ដូចដែលអ្នកបានដឹងហើយថាកាលបរិច្ឆេទទាំងអស់ត្រូវបានរក្សាទុកក្នុង mysql ក្នុងលំដាប់បញ្ច្រាសឆ្នាំ - ខែ - ថ្ងៃ (2008-10-18) ជួនកាលសូម្បីតែដោយគ្មានសញ្ញាបំបែក (20081018) ។
ដើម្បីបង្ហាញកាលបរិច្ឆេទ អ្នកត្រូវបំប្លែងវាទៅជាទម្រង់ធម្មតាដែលអាចអានបាន។
មានវិធីពីរយ៉ាងនៃការបំប្លែងគឺមានប្រសិទ្ធភាព និងមិនមានប្រសិទ្ធភាពខ្លាំង។
វិធីដែលគ្មានប្រសិទ្ធភាពគឺនៅពេលដែលទិន្នផលកាលបរិច្ឆេទពី mysql ត្រូវបានបំប្លែងពី ដោយប្រើ php.
ខ្ញុំផ្ទាល់បានធ្វើរឿងនេះដោយខ្លួនឯង។ សម្រាប់រយៈពេលដ៏យូរមួយ។. មុនពេលបង្ហាញ ខ្ញុំបានប្តូរកាលបរិច្ឆេទនីមួយៗដោយប្រើមុខងារ php ។
ប្រសិនបើចំនួននៃការបំប្លែងមិនមានទំហំធំទេនោះ អ្នកអាចប្តូរកាលបរិច្ឆេទដោយប្រើ PHP នោះ មិនមានអ្វីខុសជាមួយនោះទេ ប៉ុន្តែប្រសិនបើអ្នកត្រូវការដកកំណត់ត្រារាប់សិប ឬរាប់រយរាប់ពាន់ ហើយបំប្លែងកាលបរិច្ឆេទនីមួយៗ នោះជាការបំប្លែង។ កាលបរិច្ឆេទដែលប្រើ mysql នឹងលឿនជាង។
មានមុខងារដ៏អស្ចារ្យនៅក្នុង mysql ដែលហៅថា DATE_FORMAT() វាស្រដៀងទៅនឹង មុខងារ phpកាលបរិច្ឆេទ () ។
នេះគឺជាឧទាហរណ៍នៃការប្រើប្រាស់
ជ្រើសរើស DATE_FORMAT("2008-11-19","%d.%m.%Y");
លទ្ធផល
អ្វីគ្រប់យ៉ាងគឺសាមញ្ញ និងលឿនបំផុត មិនចាំបាច់ផ្លាស់ប្តូរកាលបរិច្ឆេទដោយប្រើ php ទេ។
នេះគឺជាបញ្ជីនិយមន័យសម្រាប់មុខងារនេះ។
កំណត់ | ការពិពណ៌នា |
%M | ឈ្មោះខែ (មករា...ធ្នូ) |
%W | ឈ្មោះថ្ងៃនៃសប្តាហ៍ (ថ្ងៃអាទិត្យ ... ថ្ងៃសៅរ៍) |
%D | ថ្ងៃនៃខែដែលមានបច្ច័យភាសាអង់គ្លេស (0st, 1st, 2nd, 3rd, etc.) |
%Y | ឆ្នាំ, កាលបរិច្ឆេទ, ៤ ខ្ទង់ |
%y | ឆ្នាំ, កាលបរិច្ឆេទ, 2 ខ្ទង់ |
%X | ឆ្នាំសម្រាប់សប្តាហ៍ដែលថ្ងៃអាទិត្យត្រូវបានចាត់ទុកថាជាថ្ងៃដំបូងនៃសប្តាហ៍ លេខ 4 ខ្ទង់ ប្រើជាមួយ "%V" |
%x | ឆ្នាំសម្រាប់មួយសប្តាហ៍ដែលថ្ងៃអាទិត្យត្រូវបានចាត់ទុកជាថ្ងៃដំបូងនៃសប្តាហ៍ លេខ 4 ខ្ទង់ ប្រើជាមួយ "%v" |
%a | ឈ្មោះអក្សរកាត់នៃថ្ងៃនៃសប្តាហ៍ (ព្រះអាទិត្យ ... សៅរ៍) |
%d | ថ្ងៃខែ លេខ (00..31) |
%e | ថ្ងៃនៃខែ, លេខ (0..31) |
% ម | ខែ ថ្ងៃ (00..12) |
%c | ខែ កាលបរិច្ឆេទ (0..12) |
%b | ឈ្មោះអក្សរកាត់នៃខែ (មករា ... ធ្នូ) |
%j | ថ្ងៃនៃឆ្នាំ (001..366) |
%H | ម៉ោង (00..23) |
%k | ម៉ោង (0..23) |
%h | ម៉ោង (០១..១២) |
% I | ម៉ោង (០១..១២) |
%l | ម៉ោង (1..12) |
%i | នាទី, លេខ (00..59) |
%r | ពេលវេលា ទម្រង់ 12 ម៉ោង (hh:mm:ss M) |
%T | ពេលវេលា ទម្រង់ 24 ម៉ោង (hh:mm:ss) |
%S | វិនាទី (00..59) |
%s | វិនាទី (00..59) |
%p | ព្រឹក ឬ ល្ងាច |
%w | ថ្ងៃនៃសប្តាហ៍ (0=ថ្ងៃអាទិត្យ..6=ថ្ងៃសៅរ៍) |
% U | សប្តាហ៍ (00..53) ដែលថ្ងៃអាទិត្យត្រូវបានចាត់ទុកថាជាថ្ងៃដំបូងនៃសប្តាហ៍ |
%u | សប្តាហ៍ (00..53) ដែលថ្ងៃច័ន្ទត្រូវបានចាត់ទុកថាជាថ្ងៃដំបូងនៃសប្តាហ៍ |
%V | សប្តាហ៍ (01..53) ដែលថ្ងៃអាទិត្យត្រូវបានចាត់ទុកថាជាថ្ងៃដំបូងនៃសប្តាហ៍។ ប្រើជាមួយ `%X” |
%v | សប្តាហ៍ (01..53) ដែលថ្ងៃច័ន្ទត្រូវបានចាត់ទុកថាជាថ្ងៃដំបូងនៃសប្តាហ៍។ ប្រើជាមួយ `%x” |
%% | ព្យញ្ជនៈ `%” ។ |
មតិយោបល់
27.11.2008 ----
ហេស៎!!!
ខ្លួនខ្ញុំផ្ទាល់បានធ្វើការលើ php និង mysql អស់រយៈពេលប្រាំឆ្នាំមកហើយ ហើយគ្រប់ពេលដែលខ្ញុំផ្លាស់ប្តូរកាលបរិច្ឆេទនៅក្នុង php...
វាមិនបានកើតឡើងចំពោះខ្ញុំទេដែលវានឹងកាន់តែងាយស្រួលប្រើមុខងារ mysql ដែលមានស្រាប់
11/28/2008 Zheka
ដូចគ្នា! ខ្ញុំតែងតែប្រើមុខងារ php របស់ខ្ញុំ
12/03/2008 Sergey
ជាការប្រសើរណាស់, ជាទូទៅ, មាននរណាម្នាក់សូម្បីតែប្រើវិធីសាស្រ្តនេះ?
ឬគ្រប់គ្នាប្រើ php ដើម្បីបញ្ច្រាសកាលបរិច្ឆេទ?
ខ្ញុំផ្ទាល់មិនដែលប្តូរកាលបរិច្ឆេទក្នុង mysql ទេ ខ្ញុំនៅតែធ្វើអ្វីគ្រប់យ៉ាងនៅក្នុង php
០៦/២៨/២០០៩ Ilya
ជាអកុសល គ្មានអ្វីដំណើរការទេ :(
07/08/2009 Vitaly
ឡូយ អរគុណសម្រាប់មុខងារ។ ខ្ញុំឆ្ងល់ថាតើមានសត្វកកេរផ្សេងទៀតឬ?
07/14/2009 DSaint
សូមអរគុណ វាបានជួយច្រើន។ អ្វីដែលនៅសល់គឺត្រូវបង្ហាញឈ្មោះខែជាភាសារុស្សី)
07/28/2009 Vlad
mysql=> PHP
ជ្រើសរើស unix_timestamp (start_date) ជា start_date_php
php-កូដ
date("d.m.Y",$row["start_date_php"])
PHP=>MySQL
ធ្វើបច្ចុប្បន្នភាពតារាងកំណត់ start_date=DATE_FORMAT(STR_TO_DATE("12/19/2009 6:35:22 PM","%d.%m.%Y %H:%i"),"%Y.%m.%d % H:% i")
08/18/2009 ភ្ញៀវ
2: DS Saint
មានមុខងារដ៏អស្ចារ្យបែបនេះ៖
ELT(MONTH("2004-04-10"), "មករា","កុម្ភៈ","មីនា","មេសា","ឧសភា","មិថុនា","កក្កដា","សីហា"," កញ្ញា""តុលា""វិច្ឆិកា""ធ្នូ")
ប្រើវា។ :-)
10/29/2009 វ្ល៉ាឌីមៀ
សូមអរគុណអំពី ELT(MONTH("2004-04-10"), "Jan.","Feb","March","Apr","May","June","July","Aug ""កញ្ញា""តុលា""វិច្ឆិកា""ធ្នូ")
ខ្ញុំមិនបានឮទេ។
10/07/2010 Evgeniy
តើអ្វីដំណើរការលឿនជាង? ការបំប្លែងនៅក្នុងសំណើ ឬជាលទ្ធផលនៃមុខងារ PHP?
10/07/2010 ខ្សែការពារ
យ៉ាងហោចណាស់ មានអង្គចងចាំតិចក្នុងដំណើរការ ការហៅមុខងារតិចជាងមុន ការបែងចែកអង្គចងចាំតិចជាង... ខ្ញុំប្រើអ្វីមួយដូចនេះគ្រប់ពេល ប៉ុន្តែមិនមែននៅក្នុង mysql ទេ ប៉ុន្តែនៅក្នុង postgresql។
10/08/2010 អ្នកគ្រប់គ្រង
Evgeny ខ្សែការពារបាននិយាយត្រឹមត្រូវ ការផ្លាស់ប្តូរនេះគួរតែដំណើរការកាន់តែស្រស់ស្អាតតាមរយៈមូលដ្ឋានទិន្នន័យ ប៉ុន្តែជាការពិតប្រសិនបើ យើងកំពុងនិយាយអំពីអំពីការទាញយកទិន្នន័យយ៉ាងច្រើន។
ប្រសិនបើអ្នកទាញកំណត់ត្រា 10-20 នោះវាមិនមានភាពខុសប្លែកគ្នាពីរបៀបបំប្លែងកាលបរិច្ឆេទទេបើប្រៀបធៀបទៅនឹងបន្ទុកផ្សេងទៀតនេះគឺជារឿងតូចតាច។
០១/២៧/២០១១ ភីស៊ីម៉ា
uhh អរគុណចំពោះ afftor (: មិនចាំបាច់ប្រើមុខងារ mega cool របស់ខ្ញុំទៀតទេសម្រាប់ការបំប្លែង (:
04/13/2011 Xes
របៀបប្រើវានៅក្នុង PHP
ខណៈ ($sqlr=mysql_fetch_array($sql))
{
បន្ទរ ($sqlr["comadd"]" ".$sqlr["comment"]។
");
$sqlr["comadd"] - តើអ្នកត្រូវការបង្ហាញវាជាទម្រង់ធម្មតាទេ?
}
04/14/2011 Vitaly
ខ្ញុំមានកាលបរិច្ឆេទនៅក្នុងមូលដ្ឋានទិន្នន័យក្នុងទម្រង់ 11/19/2008 ប្រភេទតារាង VARCHAR តើខ្ញុំអាចសរសេរវាឡើងវិញក្នុងមូលដ្ឋានទិន្នន័យក្នុងទម្រង់ 2008-11-19 យ៉ាងដូចម្តេច?
កាន់ដៃគ្នាយូរណាស់...
សូមអរគុណ។
04/15/2011 អ្នកគ្រប់គ្រង
Xes នេះគឺជាមុខងារ MySQL អ្នកត្រូវប្រើវានៅក្នុង សំណួរ sqlដែលវិនិច្ឆ័យដោយលេខកូដរបស់អ្នកមានទីតាំងនៅកន្លែងណាមួយខាងលើ។ វាមិនអាចប្រើនៅក្នុងផ្នែកនៃកូដនេះបានទេ។
04/15/2011 អ្នកគ្រប់គ្រង
Vitaly គ្រាន់តែប្តូរប្រភេទក្រឡាទៅជា DATE នោះ mysql នឹងបំប្លែងទិន្នន័យទាំងអស់ក្នុងក្រឡានេះដោយស្វ័យប្រវត្តិទៅជាទម្រង់ 2008-11-19។
ប៉ុន្តែក្នុងករណី មុននឹងផ្លាស់ប្តូរប្រភេទក្រឡា សូមធ្វើការបោះចោលតារាងនេះ ព្រោះភ្លាមៗនោះ មូលដ្ឋានទិន្នន័យនឹងធ្វើអ្វីមួយខុស ហើយតារាងនឹងខូចទាំងអស់គ្នា។
ប្រសិនបើវាមានសារៈសំខាន់សម្រាប់អ្នកក្នុងការចាកចេញពីប្រភេទវាលជា varchar បន្ទាប់មកបន្ទាប់ពីអ្នកកំណត់ប្រភេទ DATE សូមកំណត់វាត្រឡប់ទៅ varchar...
នេះជាជម្រើសសាមញ្ញបំផុត ប៉ុន្តែមិនត្រឹមត្រូវទាំងស្រុង ប៉ុន្តែខ្ញុំបានពិនិត្យមើលថាវាដំណើរការ។
០៥/១៤/២០១១ DDD
date("d-m-Y",strtotime("$ myrow"));
05/24/2011 Konstantin
ហើយខ្ញុំតែងតែយក SELECT *,UNIX_TIMESTAMP(created) AS បានបង្កើតពី...
ប៉ុន្តែជាមួយនឹងម៉ូទ័រ ខ្ញុំអាចធ្វើវាបានគ្រប់ទម្រង់។ សូម្បីតែមួយថ្ងៃ សូម្បីតែពេលមួយ...
ហើយប្រៀបធៀបថាមួយណាធំជាង 05/14/2011 ឬ 05/14/2010...
ហើយខ្ញុំសរសេរដូចនេះ៖
...date=".gmdate("Y-m-d H:i:s",$created)...
ហើយជាទូទៅ ខ្ញុំមិនឃើញហេតុផលដើម្បីផ្លាស់ប្តូរទម្លាប់នោះទេ។
05/24/2011 Sergey
Konstantin ខ្ញុំផ្ទាល់ប្រើវាសម្រាប់ទិន្នផល កាលបរិច្ឆេទ php() យើងគ្រាន់តែសម្លឹងមើលជម្រើសនៃការបំប្លែងកាលបរិច្ឆេទមិនមែនតាមរយៈ PHP ទេ ប៉ុន្តែតាមរយៈ mysql ។
ខ្ញុំចង់និយាយថានេះគ្រាន់តែជាទិដ្ឋភាពទូទៅនៃមុខងារ mysql ហើយវាពិតជាមានសិទ្ធិមាន...
មុខងារទាំងនេះក៏ត្រូវបានរចនាឡើងដើម្បីធ្វើការជាមួយប្រភេទទិន្នន័យប្រតិទិនផងដែរ។ សូមក្រឡេកមើលពួកគេឱ្យកាន់តែច្បាស់។
- DATE_FORMAT (កាលបរិច្ឆេទ ទម្រង់) ធ្វើទ្រង់ទ្រាយកាលបរិច្ឆេទដោយយោងតាមទម្រង់ដែលបានជ្រើសរើស។
មុខងារនេះត្រូវបានគេប្រើញឹកញាប់ណាស់។ ឧទាហរណ៍ ក្នុង MySQL ទម្រង់កាលបរិច្ឆេទគឺ YYYY-MM-DD (ឆ្នាំ-ខែ-ថ្ងៃ) ខណៈពេលដែលយើងកាន់តែស៊ាំជាមួយទម្រង់ DD-MM-YYYY (កាលបរិច្ឆេទ-ខែ-ឆ្នាំ)។ ដូច្នេះ ដើម្បីបង្ហាញកាលបរិច្ឆេទដូចធម្មតា ចាំបាច់ត្រូវធ្វើកំណែទម្រង់។
ចូរយើងផ្តល់សំណួរជាមុនសិន ហើយបន្ទាប់មកស្វែងយល់ពីរបៀបកំណត់ទម្រង់៖
ជ្រើសរើស DATE_FORMAT(CURDATE(), "%d.%m.%Y"); ការពិពណ៌នា %a ឥឡូវនេះកាលបរិច្ឆេទមើលទៅស្គាល់យើងហើយ។ ដើម្បីបញ្ជាក់ទម្រង់កាលបរិច្ឆេទ វគ្គជម្រុះពិសេសត្រូវបានប្រើ។ ដើម្បីភាពងាយស្រួល យើងរាយបញ្ជីពួកវាក្នុងតារាង។ Defred
ឈ្មោះអក្សរកាត់នៃថ្ងៃនៃសប្តាហ៍ (ច័ន្ទ - ច័ន្ទ, អង្គារ - អង្គារ, ពុធ - ពុធ, ព្រហស្បតិ៍, សុក្រ - សុក្រ, សៅរ៍ - សៅរ៍, អាទិត្យ - អាទិត្យ) ។
ឧទាហរណ៍៖
%b ជ្រើសរើស DATE_FORMAT(CURDATE(), "%a"); Defred
លទ្ធផល៖
ឧទាហរណ៍៖
%c ឈ្មោះអក្សរកាត់នៃខែ (មករា-មករា, កុម្ភៈ-កុម្ភៈ, មិនា-មីនា, មេសា-មេសា, ឧសភា-ឧសភា, មិថុនា-មិថុនា, កក្កដា-កក្កដា, សីហា-សីហា, កញ្ញា-កញ្ញា, តុលា-តុលា, វិច្ឆិកា-វិច្ឆិកា។ ខែធ្នូ-ធ្នូ)។ Defred
ជ្រើសរើស DATE_FORMAT(CURDATE(), "%b");
ឧទាហរណ៍៖
%d ខែក្នុងទម្រង់ជាលេខ (1 - 12) ។ Defred
ជ្រើសរើស DATE_FORMAT(CURDATE(), "%s");
ឧទាហរណ៍៖
%D ថ្ងៃនៃខែក្នុងទម្រង់ជាលេខដែលមានលេខសូន្យ (01 - 31)។ Defred
ជ្រើសរើស DATE_FORMAT(CURDATE(), "%d");
ឧទាហរណ៍៖
%e ថ្ងៃនៃខែក្នុងទម្រង់ជាលេខដោយគ្មានសូន្យ (1 - 31) ។ Defred
ជ្រើសរើស DATE_FORMAT(CURDATE(), "%e");
ឧទាហរណ៍៖
%H ម៉ោងដែលមានលេខសូន្យនាំមុខពី 00 ដល់ 23 ។ Defred
ជ្រើសរើស DATE_FORMAT("2011-04-15 23:03:20", "%H");
ឧទាហរណ៍៖
%h នាឡិកាដែលមានលេខសូន្យនាំមុខពី 00 ដល់ 12 ។ Defred
ជ្រើសរើស DATE_FORMAT("2011-04-15 23:03:20", "%h");
ឧទាហរណ៍៖
%i នាទីពី 00 ដល់ 59 ។ Defred
ជ្រើសរើស DATE_FORMAT("2011-04-15 23:03:20", "%i");
ឧទាហរណ៍៖
%j ថ្ងៃនៃឆ្នាំពី 001 ដល់ 366 ។ Defred
ជ្រើសរើស DATE_FORMAT("2011-04-15 23:03:20", "%j");
ឧទាហរណ៍៖
%k នាឡិកាដែលមានលេខសូន្យនាំមុខពី 0 ដល់ 23 ។ Defred
SELECT DATE_FORMAT("2011-12-31 01:03:20", "%k");
ឧទាហរណ៍៖
%l នាឡិកាដោយគ្មានលេខសូន្យនាំមុខពីលេខ 1 ដល់លេខ 12 ។ Defred
SELECT DATE_FORMAT("2011-04-15 00:03:20", "%l");
ឧទាហរណ៍៖
%M Defred
ឧទាហរណ៍៖
%M ឈ្មោះខែដោយគ្មានអក្សរកាត់។ Defred
SELECT DATE_FORMAT("2011-04-15 00:03:20", "%M");
ឧទាហរណ៍៖
% ម ខែក្នុងទម្រង់ជាលេខដែលមានលេខសូន្យនាំមុខ (01 - 12)។ Defred
SELECT DATE_FORMAT("2011-04-15 00:03:20", "%m");
ឧទាហរណ៍៖
%p AM ឬ PM សម្រាប់ទម្រង់ 12 ម៉ោង។ Defred
SELECT DATE_FORMAT("2011-04-15 00:03:20", "%p");
ឧទាហរណ៍៖
%r ពេលវេលាក្នុងទម្រង់ 12 ម៉ោង។ Defred
SELECT DATE_FORMAT("2011-04-15 00:03:20", "%r");
ឧទាហរណ៍៖
%s វិនាទីពី 00 ដល់ 59 ។ Defred
SELECT DATE_FORMAT("2011-04-15 00:03:20", "%s");
ឧទាហរណ៍៖
%T ពេលវេលាក្នុងទម្រង់ 24 ម៉ោង។ Defred
ជ្រើសរើស DATE_FORMAT("2011-04-15 21:03:20", "%T");
ឧទាហរណ៍៖
%u សប្តាហ៍ (00 - 52) ដែលថ្ងៃដំបូងនៃសប្តាហ៍គឺថ្ងៃចន្ទ។ Defred
ជ្រើសរើស DATE_FORMAT("2011-04-17 21:03:20", "%u");
ឧទាហរណ៍៖
% U សប្តាហ៍ (00 - 52) ដែលថ្ងៃដំបូងនៃសប្តាហ៍គឺថ្ងៃអាទិត្យ។ Defred
ជ្រើសរើស DATE_FORMAT("2011-04-17 21:03:20", "%U");
ឧទាហរណ៍៖
%W ឈ្មោះថ្ងៃនៃសប្តាហ៍ដោយគ្មានអក្សរកាត់។ Defred
ជ្រើសរើស DATE_FORMAT("2011-04-17 21:03:20", "%W");
ឧទាហរណ៍៖
%w ចំនួនថ្ងៃនៃសប្តាហ៍ (0 - ថ្ងៃអាទិត្យ, 6 - ថ្ងៃសៅរ៍) ។ Defred
ជ្រើសរើស DATE_FORMAT("2011-04-17 21:03:20", "%w");
ឧទាហរណ៍៖
%Y ឆ្នាំ, 4 ប្រភេទ។ Defred
ជ្រើសរើស DATE_FORMAT("2011-04-17 21:03:20", "%Y");
ឧទាហរណ៍៖
%y ឆ្នាំ, 2 ប្រភេទ។ Defred
ជ្រើសរើស DATE_FORMAT("2011-04-17 21:03:20", "%y");
ឧទាហរណ៍៖
- STR_TO_DATE(កាលបរិច្ឆេទ ទម្រង់) គឺជាមុខងារបញ្ច្រាសនៃកំណែមុន វាត្រូវការកាលបរិច្ឆេទក្នុងទម្រង់ ហើយត្រឡប់កាលបរិច្ឆេទក្នុងទម្រង់ MySQL ។
SELECT STR_TO_DATE("04/17/2011 23:50", "%d.%m.%Y %H:%i");
- មុខងារ TIME_FORMAT(ពេលវេលា ទ្រង់ទ្រាយ) គឺស្រដៀងនឹងមុខងារ DATE_FORMAT() ប៉ុន្តែត្រូវបានប្រើប្រាស់សម្រាប់តែពេលវេលាប៉ុណ្ណោះ៖
ជ្រើសរើស TIME_FORMAT("22:38:15", "%H-%i-%s");
- អនុគមន៍ GET_FORMAT (កាលបរិច្ឆេទ ទ្រង់ទ្រាយ) ត្រឡប់ខ្សែទម្រង់ដែលត្រូវគ្នានឹងទម្រង់ពេលវេលាមួយក្នុងចំណោមទម្រង់ចំនួនប្រាំ៖
អឺរ៉ូ - ស្តង់ដារអឺរ៉ុប
សហរដ្ឋអាមេរិក - ស្តង់ដារអាមេរិក
JIS - ស្តង់ដារឧស្សាហកម្មជប៉ុន
អាយអេសអូ - ស្តង់ដារ ISO (អង្គការអន្តរជាតិស្តង់ដារ)
ផ្ទៃក្នុង - ស្តង់ដារអន្តរជាតិមុខងារនេះគឺល្អក្នុងការប្រើជាមួយមុខងារមុន - DATE_FORMAT()។ តោះមើលឧទាហរណ៍៖
ជ្រើសរើស GET_FORMAT(DATE, "EUR"), DATE_FORMAT("2011-04-17", GET_FORMAT(DATE, "EUR"));
ដូចដែលអ្នកអាចមើលឃើញ មុខងារ GET_FORMAT() ខ្លួនវាត្រឡប់ទម្រង់បទបង្ហាញ ហើយរួមជាមួយមុខងារ DATE_FORMAT() វាបង្កើតកាលបរិច្ឆេទក្នុងទម្រង់ដែលត្រូវការ។ បង្កើតសំណួរផ្ទាល់ខ្លួនរបស់អ្នកជាមួយនឹងស្តង់ដារទាំងប្រាំ ហើយឃើញភាពខុសគ្នា។
តម្លៃក្នុងទម្រង់ទាំងនេះ៖
ជាខ្សែអក្សរក្នុងទម្រង់ "YYYY-MM-DD" ឬ "YY-MM-DD" ។ វាក្យសម្ព័ន្ធដែលបន្ធូរបន្ថយត្រូវបានអនុញ្ញាត៖ តួអក្សរវណ្ណយុត្តិណាមួយអាចត្រូវបានប្រើជាសញ្ញាបំបែករវាងផ្នែកកាលបរិច្ឆេទ។ ឧទាហរណ៍ "2012-12-31", "2012/12/31", "2012^12^31" និង "2012@12@31" គឺសមមូល។
ជាខ្សែអក្សរដោយគ្មានកំណត់ព្រំដែនក្នុងទម្រង់ "YYYYMMDD" ឬ "YYMMDD" បានផ្តល់ថាខ្សែអក្សរមានន័យដូចកាលបរិច្ឆេទ។ ឧទាហរណ៍ "20070523" និង "070523" ត្រូវបានបកស្រាយថា "2007-05-23" ប៉ុន្តែ "071332" គឺខុសច្បាប់ (វាមានផ្នែកគ្មានន័យខែ និងថ្ងៃ) ហើយក្លាយជា "0000-00-00" ។
ជាលេខក្នុងទម្រង់ YYYYMMDD ឬ YYMMDD ដរាបណាលេខមានន័យដូចកាលបរិច្ឆេទ។ ឧទាហរណ៍ 19830905 និង 830905 ត្រូវបានបកស្រាយថាជា "1983-09-05" ។
ដូច្នេះ ខ្សែអក្សរ "08/25/2012" មិនមែនជាកាលបរិច្ឆេទ MySQL ត្រឹមត្រូវទេ។ អ្នកមានជម្រើសបួន (តាមលំដាប់មិនច្បាស់លាស់នៃចំណូលចិត្ត ទេ ព័ត៌មានបន្ថែមអំពីតម្រូវការរបស់អ្នក)៖
- $dt = \DateTime::createFromFormat("m/d/Y", $_POST["date"]);
ហើយបន្ទាប់មក៖
ទទួលបានខ្សែអក្សរដែលមានទម្រង់សមរម្យ៖
$date = $dt->format("Y-m-d");
ទទួលបានត្រាពេលវេលា UNIX៖
$timestamp = $dt->getTimestamp();
ដែលត្រូវបានបញ្ជូនដោយផ្ទាល់ទៅ MySQL FROM_UNIXTIME() :
បញ្ចូលទៅក្នុង user_date VALUES ("", "$name", FROM_UNIXTIME($timestamp))
កំណត់រចនាសម្ព័ន្ធ Datepicker ដើម្បីផ្តល់កាលបរិច្ឆេទក្នុងទម្រង់ដែលបានគាំទ្រដោយប្រើ altField រួមជាមួយ altFormat៖
$("selector").datepicker(( altField: "#actualDate" altFormat: "yyyy-mm-dd" ));
ឬប្រសិនបើអ្នកសប្បាយចិត្តដែលអ្នកប្រើប្រាស់ឃើញកាលបរិច្ឆេទក្នុងទម្រង់ YYYY-MM-DD គ្រាន់តែកំណត់ប៉ារ៉ាម៉ែត្រទម្រង់កាលបរិច្ឆេទជំនួសវិញ៖
$("អ្នកជ្រើសរើស").datepicker(( dateFormat: "yyyy-mm-dd" ));
បញ្ចូលខ្សែអក្សរដោយដៃទៅជាព្យញ្ជនៈត្រឹមត្រូវ៖
$parts = explode("/", $_POST["date"]); $date = "$parts-$parts-$parts";
ការព្រមាន
-
ប្រភេទ DATE ត្រូវបានប្រើសម្រាប់តម្លៃដែលមានផ្នែកកាលបរិច្ឆេទ ប៉ុន្តែមិនមានផ្នែកពេលវេលាទេ។ MySQL ទាញយក និងបង្ហាញតម្លៃ DATE ក្នុងទម្រង់ "YYYY-MM-DD" ។ ជួរដែលគាំទ្រគឺចាប់ពី "1000-01-01" ដល់ "9999-12-31" ។
ប្រភេទ DateTime ត្រូវបានប្រើសម្រាប់តម្លៃដែលមានទាំងកាលបរិច្ឆេទ និងពេលវេលា។ MySQL ទាញយក និងបង្ហាញតម្លៃ DateTime ក្នុងទម្រង់ "YYYY-MM-DD HH:MM:SS" ។ ជួរដែលគាំទ្រគឺចាប់ពី "1000-01-01 00:00:00" ដល់ "9999-12-31 23:59:59" ។
កូដរបស់អ្នកងាយរងគ្រោះនឹងការចាក់ SQL ។អ្នកពិតជាគួរប្រើសេចក្តីថ្លែងការណ៍ដែលបានរៀបចំ ដែលអ្នកឆ្លងកាត់អថេររបស់អ្នកជាប៉ារ៉ាម៉ែត្រដែលមិនត្រូវបានវាយតម្លៃទៅ SQL ។ ប្រសិនបើអ្នកមិនដឹងថាខ្ញុំកំពុងនិយាយអំពីអ្វី ឬរបៀបជួសជុលវា សូមអានរឿង Bobby Tables ។
ដូច្នេះ ប្រភេទទិន្នន័យប្រតិទិនទាំងអស់ត្រូវបានពិពណ៌នាលម្អិតនៅក្នុងផ្នែក “10.3. ប្រភេទកាលបរិច្ឆេទ និងពេលវេលា » ការបង្រៀន MySQL ។ ក ព័ត៌មានសំខាន់ទាក់ទងនឹងការគាំទ្រ DBMS សម្រាប់តំបន់ពេលវេលាត្រូវបានពិពណ៌នានៅក្នុងផ្នែក "9.7 ។ ការគាំទ្រតំបន់ពេលវេលាម៉ាស៊ីនមេ MySQL" ។ អ្វីគ្រប់យ៉ាងដូចខាងក្រោមគឺផ្អែកលើការសិក្សាសៀវភៅដៃ។ ក្នុងពេលជាមួយគ្នានេះ មានតែភាពខុសប្លែកគ្នានៃការជ្រើសរើសក្នុងការពេញចិត្តនៃប្រភេទមួយ ឬប្រភេទផ្សេងទៀតប៉ុណ្ណោះដែលត្រូវបានចង្អុលបង្ហាញនៅទីនេះ ដូច្នេះសម្ភារៈនេះមិនជំនួសសៀវភៅដៃតាមវិធីណាក៏ដោយ ប៉ុន្តែបំពេញបន្ថែមវា។
នៅដើមដំបូង ការពិពណ៌នាសង្ខេបប្រភេទនីមួយៗ៖
- TIMESTAMP - ប្រភេទទិន្នន័យសម្រាប់រក្សាទុកកាលបរិច្ឆេទ និងពេលវេលា។ ទិន្នន័យត្រូវបានរក្សាទុកជាចំនួនវិនាទីដែលបានកន្លងផុតទៅចាប់តាំងពីការចាប់ផ្តើមនៃ "យុគសម័យយូនីក" ។ ជួរតម្លៃ៖ 1970-01-01 00:00:00 - 2038-12-31 00:00:00 ។ កាន់កាប់ 4 បៃ។
- YEAR - ប្រភេទទិន្នន័យសម្រាប់រក្សាទុកឆ្នាំ។ ជួរតម្លៃ៖ 1901 - 2155. កាន់កាប់ 1 បៃ។
- DATE គឺជាប្រភេទទិន្នន័យសម្រាប់រក្សាទុកកាលបរិច្ឆេទ។ ជួរតម្លៃ៖ 1000-01-01 - 9999-12-31 ។ កាន់កាប់ 3 បៃ។
- TIME គឺជាប្រភេទទិន្នន័យសម្រាប់រក្សាទុកពេលវេលា។ ជួរតម្លៃ៖ −828:59:59 - 828:59:59 ។ កាន់កាប់ 3 បៃ។
- DATETIME គឺជាប្រភេទទិន្នន័យសម្រាប់រក្សាទុកកាលបរិច្ឆេទ និងពេលវេលា។ ជួរតម្លៃ៖ 1000-01-01 00:00:00 - 9999-12-31 00:00:00 ។ កាន់កាប់ 8 បៃ។
បន្ទាប់ពីការវិភាគការពិពណ៌នានៃប្រភេទដែលបានបង្ហាញខាងលើអ្នកអាចទាញការសន្និដ្ឋានស្ទើរតែទាំងអស់អំពីគុណសម្បត្តិនិងគុណវិបត្តិនៃប្រភេទមួយចំនួន។ អ្វីគ្រប់យ៉ាងគឺសាមញ្ញនិងជាក់ស្តែង។
ប៉ុន្តែមុននឹងនិយាយអំពីការប្រើប្រាស់ប្រភេទទាំងនេះ ខ្ញុំចង់កត់សម្គាល់ថានៅក្នុងការអនុវត្ត ប្រភេទមួយផ្សេងទៀតត្រូវបានគេប្រើជាញឹកញាប់ដើម្បីរក្សាទុកកាលបរិច្ឆេទ និងពេលវេលា៖ តម្លៃចំនួនគត់ (សម្រាប់រក្សាទុកកាលបរិច្ឆេទ - INT (4 បៃ) កាលបរិច្ឆេទ និងពេលវេលា - BIGINT (8 បៃ)) ។ ភាពខុសគ្នានៃការប្រើប្រាស់ ប្រភេទចំនួនគត់ពី DATE និង DATETIME តែនៅក្នុងនោះទិន្នន័យមិនត្រូវបានធ្វើទ្រង់ទ្រាយកំឡុងពេលលទ្ធផល ហើយនៅក្នុងការគណនាជាមួយកាលបរិច្ឆេទ និងពេលវេលា ចំនួនគត់ត្រូវតែបំប្លែងទៅជាប្រភេទប្រតិទិនដែលសមស្រប។ លើសពីនេះទៀតមិនមានការត្រួតពិនិត្យសម្រាប់សុពលភាពនៃតម្លៃដែលបានបង្ហាញមុនពេលរក្សាទុកទេ។ សមត្ថភាពតម្រៀបត្រូវបានរក្សាទុក។ ដូច្នេះ វាសមហេតុផលក្នុងការប្រើ INT និង BIGINT នៅក្នុងករណីដូចគ្នាទៅនឹង DATE និង DATETIME ដើម្បីបង្កើនភាពចល័ត និងឯករាជ្យភាពពី DBMS ។ ខ្ញុំមិនឃើញមានអត្ថប្រយោជន៍ផ្សេងទៀតទេ បើមានខ្ញុំស្នើឱ្យអ្នកបង្ហាញវានៅក្នុងមតិយោបល់។
ការប្រើប្រាស់ប្រភេទទិន្នន័យប្រតិទិននៅក្នុង MySQL
ចូរចាប់ផ្តើមជាមួយសាមញ្ញបំផុត - ប្រភេទ ឆ្នាំ. អត្ថប្រយោជន៍តែមួយគត់របស់វាគឺទំហំតូចរបស់វា - ត្រឹមតែ 1 បៃ។ ប៉ុន្តែដោយសារតែវាមានការកំណត់ជួរយ៉ាងតឹងរ៉ឹង តម្លៃដែលអាចទទួលយកបាន។(ប្រភេទអាចផ្ទុកបានតែ 255 ប៉ុណ្ណោះ។ អត្ថន័យផ្សេងគ្នា) ខ្ញុំមានការលំបាកក្នុងការស្រមៃមើលស្ថានភាពជាក់ស្តែងដែលមនុស្សម្នាក់អាចចង់រក្សាទុកឆ្នាំយ៉ាងតឹងរ៉ឹងក្នុងចន្លោះពីឆ្នាំ 1901 ដល់ឆ្នាំ 2155។ លើសពីនេះ ប្រភេទ SMALLINT (2 បៃ) ផ្តល់នូវជួរដែលគ្រប់គ្រាន់ក្នុងស្ថានភាពភាគច្រើនដើម្បីរក្សាទុកក្នុងមួយឆ្នាំ។ ហើយការរក្សាទុក 1 បៃក្នុងមួយជួរក្នុងតារាងទិន្នន័យមិនសមហេតុផលទេនៅក្នុងពេលវេលារបស់យើង។ប្រភេទ DATEនិង DATETIMEអាចត្រូវបានរួមបញ្ចូលគ្នាជាក្រុមមួយ។ ពួកគេរក្សាទុកកាលបរិច្ឆេទ ឬកាលបរិច្ឆេទ និងពេលវេលាជាមួយយ៉ាងពិតប្រាកដ ជួរធំទូលាយតម្លៃដែលអាចទទួលយកបាន ឯករាជ្យនៃតំបន់ពេលវេលាដែលបានកំណត់នៅលើម៉ាស៊ីនមេ។ ការប្រើប្រាស់របស់ពួកគេពិតជាធ្វើឱ្យយល់បានជាក់ស្តែង។ ប៉ុន្តែប្រសិនបើអ្នកចង់រក្សាទុកកាលបរិច្ឆេទសម្រាប់ព្រឹត្តិការណ៍ប្រវត្តិសាស្ត្រដែលត្រលប់ទៅហួសសម័យទូទៅ អ្នកនឹងត្រូវជ្រើសរើសប្រភេទទិន្នន័យផ្សេងទៀត។ ប្រភេទទាំងនេះគឺល្អសម្រាប់ការរក្សាទុកកាលបរិច្ឆេទសម្រាប់ព្រឹត្តិការណ៍មួយចំនួនដែលមានសក្តានុពលនៅក្រៅជួរនៃប្រភេទ TIMESTAMP (ថ្ងៃកំណើត កាលបរិច្ឆេទចេញផ្សាយផលិតផល ការបោះឆ្នោតប្រធានាធិបតី ការបាញ់បង្ហោះរ៉ុក្កែតអវកាស។ល។)។ រឿងមួយដែលត្រូវចងចាំនៅពេលប្រើប្រភេទទាំងនេះគឺ nuance សំខាន់ប៉ុន្តែមានច្រើនទៀតនៅខាងក្រោម។
ប្រភេទ ម៉ោងអាចត្រូវបានប្រើដើម្បីរក្សាទុករយៈពេលដែលភាពត្រឹមត្រូវតិចជាង 1 វិនាទីមិនត្រូវការ ហើយរយៈពេលតិចជាង 829 ម៉ោង។ មិនមានអ្វីបន្ថែមនៅទីនេះទេ។
ប្រភេទគួរឱ្យចាប់អារម្មណ៍បំផុតនៅតែមាន - TIMESTAMP. វាគួរតែត្រូវបានពិចារណាដោយប្រៀបធៀបជាមួយ DATE និង DATETIME៖ TIMESTAMP ក៏ត្រូវបានរចនាឡើងដើម្បីរក្សាទុកកាលបរិច្ឆេទ និង/ឬពេលវេលានៃការកើតឡើងនៃព្រឹត្តិការណ៍មួយចំនួន។ ភាពខុសគ្នាដ៏សំខាន់មួយរវាងពួកវាគឺស្ថិតនៅក្នុងជួរនៃតម្លៃ៖ ជាក់ស្តែង TIMESTAMP មិនស័ក្តិសមសម្រាប់ការរក្សាទុកព្រឹត្តិការណ៍ប្រវត្តិសាស្ត្រ (សូម្បីតែដូចជាថ្ងៃកំណើត) ប៉ុន្តែគឺល្អបំផុតសម្រាប់ការរក្សាទុកបច្ចុប្បន្ន (ការកត់ត្រា កាលបរិច្ឆេទនៃការបង្ហោះអត្ថបទ ការបន្ថែមផលិតផល ការដាក់ការបញ្ជាទិញ) និងព្រឹត្តិការណ៍ដែលនឹងមកដល់នាពេលខាងមុខនៅក្នុងព្រឹត្តិការណ៍នាពេលអនាគតដែលអាចមើលឃើញ (ការចេញផ្សាយកំណែថ្មី ប្រតិទិន និងកម្មវិធីកំណត់ពេលជាដើម)។
ភាពងាយស្រួលចម្បងនៃការប្រើប្រាស់ប្រភេទ TIMESTAMP គឺថាសម្រាប់ជួរឈរនៃប្រភេទនេះនៅក្នុងតារាង អ្នកអាចកំណត់តម្លៃលំនាំដើមក្នុងទម្រង់នៃការជំនួសនៃពេលវេលាបច្ចុប្បន្ន ក៏ដូចជាការកំណត់ពេលវេលាបច្ចុប្បន្ននៅពេលធ្វើបច្ចុប្បន្នភាពកំណត់ត្រាមួយ។ ប្រសិនបើអ្នកត្រូវការលក្ខណៈពិសេសទាំងនេះ នោះមានឱកាស 99% ដែល TIMESTAMP គឺជាអ្វីដែលអ្នកត្រូវការ។ (សូមមើលសៀវភៅណែនាំអំពីរបៀបធ្វើវា។ )
កុំខ្លាចថាកម្មវិធីរបស់អ្នកនឹងឈប់ដំណើរការ នៅពេលដែលយើងខិតជិតដល់ឆ្នាំ 2038។ ទីមួយ មុនពេលនេះ កម្មវិធីរបស់អ្នកទំនងជានឹងត្រូវបានបញ្ឈប់ការប្រើប្រាស់ (ជាពិសេសកំណែដែលត្រូវបានសរសេរឥឡូវនេះ)។ ទីពីរ នៅពេលដែលកាលបរិច្ឆេទនេះខិតជិតមកដល់ អ្នកអភិវឌ្ឍន៍ MySQL ពិតជានឹងមករកអ្វីមួយដើម្បីរក្សាកម្មវិធីរបស់អ្នកឱ្យដំណើរការ។ អ្វីគ្រប់យ៉ាងនឹងត្រូវបានដោះស្រាយក៏ដូចជាបញ្ហា Y2K ។
ដូច្នេះ យើងប្រើប្រភេទ TIMESTAMP ដើម្បីរក្សាទុកកាលបរិច្ឆេទ និងពេលវេលានៃព្រឹត្តិការណ៍នៃពេលវេលារបស់យើង និង DATETIME និង DATE ដើម្បីរក្សាទុកកាលបរិច្ឆេទ និងពេលវេលានៃព្រឹត្តិការណ៍ប្រវត្តិសាស្ត្រ ឬព្រឹត្តិការណ៍នៃអនាគតដ៏ជ្រាលជ្រៅ។
ជួរតម្លៃគឺ ភាពខុសគ្នាសំខាន់រវាងប្រភេទ TIMESTAMP, DATETIME និង DATE ប៉ុន្តែមិនមែនជារឿងសំខាន់នោះទេ។ មេដែល TIMESTAMP រក្សាទុកតម្លៃនៅក្នុង UTC ។ នៅពេលរក្សាទុកតម្លៃ វាត្រូវបានបកប្រែពីតំបន់ពេលវេលាបច្ចុប្បន្នទៅជា UTC ហើយនៅពេលអានវា វាត្រូវបានបកប្រែពីតំបន់ពេលវេលាបច្ចុប្បន្នពី UTC ។ DATETIME និង DATE តែងតែរក្សាទុក និងបង្ហាញពេលវេលាដូចគ្នា ដោយមិនគិតពីតំបន់ពេលវេលា។
តំបន់ពេលវេលាត្រូវបានកំណត់ MySQL DBMSជាសកល ឬ សម្រាប់ការតភ្ជាប់បច្ចុប្បន្ន.ក្រោយអាចប្រើដើម្បីធានាបាននូវប្រតិបត្តិការ អ្នកប្រើប្រាស់ផ្សេងគ្នានៅក្នុងតំបន់ពេលវេលាផ្សេងៗគ្នានៅកម្រិត DBMS ។ តម្លៃពេលវេលាទាំងអស់នឹងត្រូវបានរក្សាទុកជារូបវ័ន្តនៅក្នុង UTC ហើយបានទទួលពីអតិថិជន និងផ្តល់ទៅឱ្យអតិថិជន - នៅក្នុងតម្លៃនៃតំបន់ពេលវេលារបស់គាត់។ ប៉ុន្តែនៅពេលប្រើប្រភេទទិន្នន័យ TIMESTAMP ប៉ុណ្ណោះ។ DATE និង DATETIME តែងតែទទួល រក្សាទុក និងត្រឡប់តម្លៃដូចគ្នា។
មុខងារ NOW() និងសទិសន័យរបស់វាត្រឡប់តម្លៃពេលវេលានៅក្នុងតំបន់ពេលវេលាបច្ចុប្បន្នរបស់អ្នកប្រើ។
ដោយគិតពីកាលៈទេសៈទាំងអស់នេះ អ្នកត្រូវតែមានការប្រុងប្រយ័ត្នបំផុតនៅពេលផ្លាស់ប្តូរតំបន់ពេលវេលានៅក្នុងការតភ្ជាប់ទៅម៉ាស៊ីនមេ និងប្រើប្រាស់ប្រភេទ DATE និង DATETIME។ ប្រសិនបើអ្នកត្រូវការរក្សាទុកកាលបរិច្ឆេទ (ឧទាហរណ៍ថ្ងៃខែឆ្នាំកំណើត) នោះនឹងមិនមានបញ្ហាអ្វីទេ។ ថ្ងៃខែឆ្នាំកំណើតគឺដូចគ្នានៅក្នុងតំបន់ណាមួយ។ ទាំងនោះ។ ប្រសិនបើអ្នកកើតនៅថ្ងៃទី 1 ខែមករា វេលាម៉ោង 0:00 UTC/GMT+0 នោះនេះគឺជា ទេ។មានន័យថា នៅអាមេរិក ពួកគេនឹងប្រារព្ធខួបកំណើតរបស់អ្នកនៅថ្ងៃទី 31 ខែធ្នូ។ ប៉ុន្តែប្រសិនបើអ្នកសម្រេចចិត្តរក្សាទុក ពេលវេលាព្រឹត្តិការណ៍នៅក្នុងជួរ DATETIME បន្ទាប់មកវានឹងមិនអាចដំណើរការជាមួយតំបន់ពេលវេលារបស់អ្នកប្រើប្រាស់នៅកម្រិត DBMS បានទេ។ ខ្ញុំសូមពន្យល់ជាមួយឧទាហរណ៍៖
អ្នកប្រើប្រាស់ X ធ្វើការនៅក្នុងតំបន់ UTC/GMT+2, Y - នៅក្នុងតំបន់ UTC/GMT+3។ សម្រាប់ការភ្ជាប់អ្នកប្រើប្រាស់ទៅ MySQL តំបន់ពេលវេលាដែលត្រូវគ្នា (នីមួយៗមានរបស់វា) ត្រូវបានកំណត់។ អ្នកប្រើប្រាស់បង្ហោះសារនៅលើវេទិកា យើងចាប់អារម្មណ៍លើកាលបរិច្ឆេទដែលសារត្រូវបានសរសេរ។
ជម្រើសទី 1៖ DATETIME។ អ្នកប្រើប្រាស់ X សរសេរសារនៅម៉ោង 14:00 UTC/GMT+2។ តម្លៃនៅក្នុងវាល "កាលបរិច្ឆេទ" នៃសារត្រូវបានជំនួសជាលទ្ធផលនៃការប្រតិបត្តិមុខងារ NOW() - 14:00 ។ អ្នកប្រើប្រាស់ Y អានពេលវេលាដែលសារត្រូវបានសរសេរ ហើយឃើញដូចគ្នានៅម៉ោង 14:00 ។ ប៉ុន្តែការកំណត់របស់គាត់ត្រូវបានកំណត់ទៅ UTC/GMT+3 ហើយគាត់គិតថាសារនេះត្រូវបានសរសេរមិនមែនទើបតែពេលនេះទេ ប៉ុន្តែមួយម៉ោងមុន។
ជម្រើសទី 2៖ TIMESTAMP អ្នកប្រើប្រាស់ X សរសេរសារនៅម៉ោង 14:00 UTC/GMT+2។ វាល "កាលបរិច្ឆេទ" មានលទ្ធផលនៃការអនុវត្តមុខងារ NOW() - in ក្នុងករណីនេះ- 12:00 UTC/GMT+0។ UserY អានពេលវេលាដែលសារត្រូវបានសរសេរ និងទទួល (UTC/GMT+3)(12:00 UTC/GMT+0) = 15:00 UTC/GMT+3។ អ្វីគ្រប់យ៉ាងប្រែទៅជាពិតជារបៀបដែលយើងចង់បាន។ ហើយសំខាន់បំផុត វាងាយស្រួលប្រើខ្លាំងណាស់៖ ដើម្បីគាំទ្រតំបន់ពេលវេលាផ្ទាល់ខ្លួន អ្នកមិនចាំបាច់សរសេរកូដបំប្លែងពេលវេលាណាមួយឡើយ។
លទ្ធភាពនៃការជំនួសម៉ោងបច្ចុប្បន្ន និងធ្វើការជាមួយតំបន់ពេលវេលាក្នុងប្រភេទ TIMESTAMP គឺមានឥទ្ធិពលខ្លាំងណាស់ ដែលប្រសិនបើអ្នកត្រូវការរក្សាទុកកាលបរិច្ឆេទដោយគ្មានពេលវេលានៅក្នុងកំណត់ហេតុជាក់លាក់ អ្នកនៅតែគួរប្រើ TIMESTAMP ជំនួសឱ្យ DATE ដោយមិនរក្សាទុក 1 បៃនៃភាពខុសគ្នា រវាងពួកគេ។ ក្នុងករណីនេះគ្រាន់តែមិនអើពើ "00:00:00" ។
ប្រសិនបើអ្នកមិនអាចប្រើ TIMESTAMP ដោយសារតែជួរតម្លៃរបស់វាតូច (ជាធម្មតា 1-2 ករណីធៀបនឹង 10-15 នៅក្នុងមូលដ្ឋានទិន្នន័យគេហទំព័រ) អ្នកនឹងត្រូវប្រើ DATETIME ហើយកែតម្រូវតម្លៃរបស់វាដោយប្រុងប្រយ័ត្ននៅក្នុង នៅកន្លែងត្រឹមត្រូវ។(ឧ. ពេលសរសេរទៅវាលនេះ បំប្លែងកាលបរិច្ឆេទទៅជា UTC ហើយពេលអាន - ទៅម៉ោងនៅក្នុងតំបន់របស់អ្នកអាន)។ ប្រសិនបើអ្នកគ្រាន់តែរក្សាទុកកាលបរិច្ឆេទ នោះប្រហែលជាមិនមានបញ្ហាអ្វីទេដែលអ្នកមានតំបន់ពេលវេលា៖ ឆ្នាំថ្មីមនុស្សគ្រប់គ្នាប្រារព្ធថ្ងៃទី 1 ខែមករាយោងទៅតាមម៉ោងក្នុងស្រុក មិនចាំបាច់បកប្រែអ្វីនៅទីនេះទេ។
ដើម្បីចាប់ផ្តើម ខ្ញុំចង់ប៉ះលើប្រធានបទនៃទម្រង់ណាដែលល្អបំផុតដើម្បីរក្សាទុកកាលបរិច្ឆេទនៅក្នុងមូលដ្ឋានទិន្នន័យ៖ TIMESTAMPឬ DATETIME. សំណួរនេះបាននិងកំពុងត្រូវបានលើកឡើងជាច្រើនដងនៅលើវេទិកា ប្លក់ ជាដើម។ ប៉ុន្តែដើម្បីកុំឱ្យអ្នកបញ្ជូនអ្នកទៅកាន់ម៉ាស៊ីនស្វែងរកភ្លាមៗ ខ្ញុំនឹងព្យាយាម នៅក្នុងពាក្យសាមញ្ញហើយបង្ហាញភាពខុសគ្នាជាមួយឧទាហរណ៍។ ប្រភេទ DATETIME- រក្សាទុកតម្លៃកាលបរិច្ឆេទក្នុងទម្រង់ "YYYY-MM-DD HH:MM:SS" និងមិនអាស្រ័យលើតំបន់ពេលវេលា។ TIMESTAMP- រក្សាទុកត្រាពេលវេលា, i.e. ចំនួនវិនាទីដែលបានកន្លងផុតទៅចាប់តាំងពីថ្ងៃទី 1 ខែមករាឆ្នាំ 1970 ។ MySQL បំប្លែងតម្លៃទាំងនេះដោយគិតគូរពីតំបន់ពេលវេលាបច្ចុប្បន្ន ទាំងពេលសរសេរទៅមូលដ្ឋានទិន្នន័យ និងពេលចេញលទ្ធផលពីវា។ តើនេះមានន័យយ៉ាងណា...
ជាឧទាហរណ៍ អ្នកទើបតែបានបន្ថែមអត្ថបទមួយទៅមូលដ្ឋានទិន្នន័យ ហើយនៅលើប្រតិទិនរបស់អ្នកវាគឺជាខែមករា 2014 ហើយនៅលើនាឡិការបស់អ្នកវាគឺម៉ោង 01:00។ ប្រសិនបើវាលកាលបរិច្ឆេទមាន ប្រភេទ DATETIMEបន្ទាប់មកអ្នកគ្រប់គ្នាដែលចូលមើលគេហទំព័រនឹងឃើញកាលបរិច្ឆេទ និងពេលវេលានេះយ៉ាងពិតប្រាកដ ដោយមិនគិតពីទីកន្លែងរស់នៅរបស់ពួកគេ។ អ្វីៗហាក់ដូចជាល្អ ប៉ុន្តែអ្នកប្រើប្រាស់ ( តោះហៅគាត់ថា Bill G) រស់នៅកន្លែងណាមួយក្នុងទីក្រុងញូវយ៉ក ខែមករា ទីមួយមិនទាន់មកដល់ទេ - សម្រាប់គាត់គឺថ្ងៃទី 31 ខែធ្នូ ឆ្នាំ 2013 ហើយនាឡិកាបង្ហាញម៉ោង 19:00។ គាត់ឆ្ងល់បន្តិចព្រោះ... គាត់មិនទាន់បានចាប់ផ្តើមប្រារព្ធពិធីចូលឆ្នាំថ្មីនៅឡើយទេ ប៉ុន្តែគាត់កំពុងស្រមៃមើល "អត្ថបទពីអនាគត" រួចហើយ ;) វានឹងមិនកើតឡើងជាមួយប្រភេទ TIMESTAMP ទេ ពីព្រោះ នៅពេលចេញលទ្ធផល តំបន់ពេលវេលារបស់វានឹងត្រូវបានយកមកពិចារណា។
“អ្វីគ្រប់យ៉ាងគឺច្បាស់ហើយ!” អ្នកនិយាយហើយប្តូរវាលកាលបរិច្ឆេទទាំងអស់យ៉ាងលឿនទៅជាប្រភេទ TIMESTAMP ហើយ Bill G នឹងដកដង្ហើមធំ ប៉ុន្តែមិនយូរទេ។ នៅពេលចុះឈ្មោះនៅលើគេហទំព័ររបស់អ្នក Bill បានចង្អុលបង្ហាញកាលបរិច្ឆេទនិងពេលវេលានៃកំណើតរបស់គាត់។ ធ្វើដំណើរជុំវិញពិភពលោក គាត់តែងតែមើលគេហទំព័ររបស់អ្នក ហើយស្វែងយល់ដោយភាពភ័យរន្ធត់ថា ពេលវេលា និង ពេលខ្លះថ្ងៃខែឆ្នាំកំណើតរបស់គាត់ តែងតែខុសគ្នា ដោយសារតែ... ត្រូវបានបង្ហាញដោយគិតគូរពីតំបន់ពេលវេលាដែលវាស្ថិតនៅ នៅពេលនេះ. បាទ ក្នុងករណីនេះ ប្រភេទ TIMESTAMP បានលេងសើចយ៉ាងសាហាវ។
យើងសន្និដ្ឋានថាសម្រាប់កិច្ចការជាក់លាក់ អ្នកត្រូវជ្រើសរើសប្រភេទវាលដែលសមស្រប ឬគ្រប់គ្រងការថត/លទ្ធផល អាស្រ័យលើលទ្ធផលដែលចង់បាន។
ចូរបន្តទៅបញ្ហាពេញនិយម និងជម្រើសសម្រាប់ដោះស្រាយពួកគេ។ ជ្រើសរើសកំណត់ត្រាក្នុងចន្លោះកាលបរិច្ឆេទដែលបានបញ្ជាក់ i.e. សម្រាប់ រយៈពេលជាក់លាក់ពេលវេលា។
ជ្រើសរើស * ពី `table_name` កន្លែង `date_field` រវាង "2014-07-05" និង "2014-07-15" បញ្ជាទិញដោយ `date_field`;
កំណត់ត្រាទាំងអស់នឹងត្រូវបានជ្រើសរើសដែលកាលបរិច្ឆេទនៅក្នុងវាល "date_field" នឹងស្ថិតនៅក្នុងចន្លោះពីថ្ងៃទី 5 ខែកក្កដា ឆ្នាំ 2014 ដល់ថ្ងៃទី 15 ខែកក្កដា ឆ្នាំ 2014 រួមទាំងកាលបរិច្ឆេទដែលបានបញ្ជាក់ផងដែរ។ យើងមិនត្រូវភ្លេចថាតាមកាលបរិច្ឆេទលំនាំដើមក្នុង MySQL ត្រូវបានរក្សាទុកក្នុងទម្រង់ "YYYY-MM-DD HH:MM:SS" ហើយតាមនោះ របាំងទម្រង់គឺ "%Y-%m-%d %H:%i: %s" (ស្តង់ដារ អាយអេសអូ) តើធ្វើដូចម្តេចដើម្បីដោះស្រាយបញ្ហាប្រសិនបើកាលបរិច្ឆេទមិនមកក្នុងទម្រង់នេះ? ចូរយើងបោះបង់ជម្រើស PHP ហើយមើលពីរបៀបដែលវាអាចត្រូវបានធ្វើនៅក្នុងសំណើដោយខ្លួនឯង។ ហើយសម្រាប់គោលបំណងបែបនេះយើងនឹងត្រូវការមុខងារ STR_TO_DATE(). វាក្យសម្ពន្ធ៖ STR_TO_DATE(str, ទម្រង់), កន្លែងណា " str"- ខ្សែអក្សរកាលបរិច្ឆេទ និង " ទម្រង់" គឺជាទម្រង់ដែលត្រូវនឹងវា។ តោះសាកល្បង៖
SELECT STR_TO_DATE("12/31/2013", "%d.%m.%Y"); /* "2013-12-31" */ SELECT STR_TO_DATE("31/12/13 13:50", "%d/%m/%y %H:%i"); /* "2013-12-31 13:50:00" */
លទ្ធផលនៃការប្រតិបត្តិគឺជាកាលបរិច្ឆេទក្នុងទម្រង់ដែលត្រូវបានប្រើតាមលំនាំដើមក្នុង MySQL ។ នោះគឺយើងត្រូវបញ្ជាក់មិនមែនជាទម្រង់ដែលយើងចង់ទទួលបានកាលបរិច្ឆេទលទ្ធផលនោះទេ ប៉ុន្តែជាទម្រង់ដែលយើងផ្តល់កាលបរិច្ឆេទសម្រាប់ដំណើរការ។ ដោយប្រើវិធីសាស្ត្រនេះ ធាតុខាងលើរបស់យើងអាចមើលទៅដូចនេះ៖
ជ្រើសរើស * ពី `table_name` WHERE `date_field` BETWEEN STR_TO_DATE("07/05/2014", "%d.%m.%Y") និង STR_TO_DATE("ថ្ងៃទី 15 ខែកក្កដា ឆ្នាំ 2014", "%M %d,%Y" ") បញ្ជាទិញដោយ `date_field`;
ចាប់តាំងពីយើងបានប៉ះលើបញ្ហានៃកាលបរិច្ឆេទធ្វើទ្រង់ទ្រាយ សូមក្រឡេកមើលរបៀបដើម្បីទទួលបានកាលបរិច្ឆេទនៅពេលគំរូតាមទម្រង់ដែលយើងត្រូវការ ពីព្រោះ មនុស្សជាច្រើនមានទម្លាប់មើលឃើញ "12/31/2014" ឬ "31 ធ្នូ 2014" ជាង "2014-12-31" ។ សម្រាប់គោលបំណងបែបនេះសូមប្រើមុខងារ DATE_FORMAT(). វាក្យសម្ពន្ធ៖ DATE_FORMAT(កាលបរិច្ឆេទ ទម្រង់), កន្លែងណា " កាលបរិច្ឆេទ"- ខ្សែអក្សរកាលបរិច្ឆេទ និង " ទម្រង់" - ទម្រង់ដែលត្រូវបំប្លែងទៅជា " កាលបរិច្ឆេទ"។ មិនដូចមុខងារ STR_TO_DATE() ទេ យើងខ្លួនយើងផ្ទាល់បង្ហាញពីទម្រង់លទ្ធផលដែលចង់បាន ប៉ុន្តែកាលបរិច្ឆេទត្រូវតែបញ្ជាក់នៅក្នុង ទម្រង់ ISO, i.e. "YYYY-MM-DD HH:MM:SS"។ យើងពិនិត្យ៖
SELECT DATE_FORMAT("2014-12-31", "%d.%m.%Y"); // 12/31/2014 SELECT DATE_FORMAT("2014-12-31", "%d %M %Y"); // ថ្ងៃទី ៣១ ខែ ធ្នូ ឆ្នាំ ២០១៤
ប្រសិនបើយើងកំពុងប្រាស្រ័យទាក់ទងជាមួយអ្នកក្នុងពេលជាក់ស្តែង នោះនៅចំណុចនេះ សំណួរនឹងកើតឡើងភ្លាមៗ៖ ប៉ុន្តែរបៀបបង្ហាញខែជាភាសាផ្សេងទៀត៖ អ៊ុយក្រែន រុស្ស៊ី ឬចិន?"វាសាមញ្ញណាស់ - ដំឡើងមូលដ្ឋានដែលត្រូវការ។ ហើយនេះអាចត្រូវបានធ្វើទាំងនៅក្នុង ឯកសារកំណត់រចនាសម្ព័ន្ធ MySQL (my.cnf) ឬគ្រាន់តែជាសំណើពី PHP បន្ទាប់ពីភ្ជាប់ទៅមូលដ្ឋានទិន្នន័យ និងមុនពេលសំណួរចម្បង៖
SET lc_time_names = ru_RU; ជ្រើសរើស DATE_FORMAT("2014-12-31", "%d %M %Y"); // លទ្ធផល៖ ថ្ងៃទី ៣១ ខែធ្នូ ឆ្នាំ ២០១៤ // ប្រសិនបើចង់បាន អ្នកក៏អាចបន្ថែម “g” ផងដែរ។ ឬ "ឆ្នាំ" SELECT DATE_FORMAT("2014-12-31", "%d %M %Y year"); // លទ្ធផល៖ ថ្ងៃទី ៣១ ខែ ធ្នូ ឆ្នាំ ២០១៤
សម្រស់! ;) និងឧទាហរណ៍មួយចំនួនទៀតនៃសំណើដែលតែងតែត្រូវការផងដែរ ប៉ុន្តែបណ្តាលឱ្យមានការភ័ន្តច្រឡំក្នុងចំណោមអ្នកចាប់ផ្តើមដំបូង។
// ជ្រើសរើសកំណត់ត្រាសម្រាប់ថ្ងៃបច្ចុប្បន្ន SELECT * FROM `table_name` WHERE `date_field` >= CURDATE(); // កំណត់ត្រាទាំងអស់សម្រាប់ម្សិលមិញ SELECT * FROM `table_name` WHERE `date_field` >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) និង `date_field` NOW() - INTERVAL 30 DAY; // ជ្រើសរើសអ្វីគ្រប់យ៉ាងសម្រាប់ខែជាក់លាក់នៃឆ្នាំបច្ចុប្បន្ន (ឧទាហរណ៍ ខែឧសភា) ជ្រើសរើស * ពី `table_name` WHERE YEAR(`date_field`) = YEAR(NOW()) AND MONTH(`date_field`) = 5 ; // ឬសម្រាប់ខែឧសភា ប៉ុន្តែក្នុងឆ្នាំ 2009 SELECT * FROM `table_name` WHERE YEAR(`date_field`) = 2009 AND MONTH(`date_field`) = 5;
ខ្ញុំមិនឃើញចំណុចក្នុងការពិពណ៌នាលម្អិតអំពីមុខងារ MySQL ដែលប្រើក្នុងឧទាហរណ៍ទេ ព្រោះ... ពួកគេមានវិចារណញាណ ហើយសម្រាប់អ្នកដែលមានចំណេះដឹងភាសាអង់គ្លេសតិចតួច វានឹងមិនមានការលំបាកក្នុងការយល់ដឹងថា ឧទាហរណ៍ មុខងារ ខែ()ត្រឡប់ខែនៃកាលបរិច្ឆេទ, ឆ្នាំ()- ឆ្នាំរបស់នាងនិង ថ្ងៃ() (ឬមានន័យដូច DAYOFMONTH()) - ថ្ងៃ។ ពាក្យគន្លឹះ ចន្លោះពេល- បម្រើសម្រាប់ប្រតិបត្តិការនព្វន្ធតាមកាលបរិច្ឆេទ និងការផ្លាស់ប្តូររបស់វា។
SELECT "2014-07-07 23:59:59" + INTERVAL 1 SECOND; // លទ្ធផល៖ 2014-07-08 00:00:00 SELECT "2014-07-07 23:59:59" + INTERVAL 1 DAY; // លទ្ធផល: 2014-07-08 23:59:59 // រឿងដដែល។ ប៉ុន្តែការប្រើមុខងារ DATE_ADD() SELECT DATE_ADD("2014-07-07 23:59:59", INTERVAL 1 DAY); // 2014-07-08 23:59:59 // ប្រសិនបើអ្នកត្រូវការដកជាជាងបន្ថែម SELECT DATE_SUB("2014-07-07 23:59:59", INTERVAL 1 DAY); // 2014-07-06 23:59:59 // ឬគ្រាន់តែដូចនោះ SELECT "2014-07-07 23:59:59" - INTERVAL 1 DAY; // 2014-07-06 23:59:59
ទាំងនេះមិនមែនជាមុខងារទាំងអស់សម្រាប់ធ្វើការជាមួយកាលបរិច្ឆេទនោះទេ ហើយខ្ញុំសូមណែនាំអ្នកឱ្យឆ្លងកាត់ពួកវាសម្រាប់គោលបំណងផ្តល់ព័ត៌មាននៅលើគេហទំព័រផ្លូវការ ដើម្បីដឹងអំពីអត្ថិភាពរបស់វា ប្រសិនបើអ្នកជួបប្រទះបញ្ហាណាមួយ។ ស្ថានភាពមិនធម្មតា. ប៉ុន្តែខ្ញុំចង់សង្ឃឹមថាសូម្បីតែនេះ។ ការពិនិត្យឡើងវិញខ្លី មុខងារ MySQLសម្រាប់ធ្វើការជាមួយកាលបរិច្ឆេទនៅក្នុងអត្ថបទនេះនឹងជួយអ្នករុករកស្ថានភាព និងធ្វើការសម្រេចចិត្តត្រឹមត្រូវ។ ប្រសិនបើការលំបាកនៅតែកើតឡើងបន្ទាប់មកសួរសំណួរក្នុងប្រធានបទនេះ ឬផ្នែក "សំណួររបស់អ្នក"។ យើងនឹងដោះស្រាយជាមួយគ្នា ;)