មុខងារ Mysql សម្រាប់ធ្វើការជាមួយកាលបរិច្ឆេទ និងពេលវេលា។ ប្រភេទទិន្នន័យប្រតិទិននៅក្នុង MySQL៖ លក្ខណៈពិសេសការប្រើប្រាស់


ការបោះពុម្ភអត្ថបទនេះត្រូវបានអនុញ្ញាតតែជាមួយតំណភ្ជាប់ទៅកាន់គេហទំព័ររបស់អ្នកនិពន្ធអត្ថបទប៉ុណ្ណោះ។

ដូចដែលអ្នកបានដឹងហើយថាកាលបរិច្ឆេទទាំងអស់ត្រូវបានរក្សាទុកក្នុង 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() វាបង្កើតកាលបរិច្ឆេទក្នុងទម្រង់ដែលត្រូវការ។ បង្កើតសំណួរផ្ទាល់ខ្លួនរបស់អ្នកជាមួយនឹងស្តង់ដារទាំងប្រាំ ហើយឃើញភាពខុសគ្នា។

ឥឡូវនេះ អ្នកដឹងស្ទើរតែទាំងអស់អំពីការធ្វើការជាមួយកាលបរិច្ឆេទ និងពេលវេលានៅក្នុង MySQL ។ វានឹងមានប្រយោជន៍ខ្លាំងណាស់សម្រាប់អ្នកនៅពេលបង្កើតកម្មវិធីគេហទំព័រផ្សេងៗ។ ឧទាហរណ៍ ប្រសិនបើអ្នកប្រើបញ្ចូលកាលបរិច្ឆេទក្នុងទម្រង់មួយនៅលើគេហទំព័រក្នុងទម្រង់ដែលស្គាល់គាត់ វានឹងមិនមានការលំបាកសម្រាប់អ្នកក្នុងការអនុវត្តមុខងារចាំបាច់ដើម្បីឱ្យកាលបរិច្ឆេទលេចឡើងក្នុងមូលដ្ឋានទិន្នន័យក្នុងទម្រង់ដែលត្រូវការ។

តម្លៃក្នុងទម្រង់ទាំងនេះ៖

    ជាខ្សែអក្សរក្នុងទម្រង់ "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 ត្រឹមត្រូវទេ។ អ្នកមានជម្រើសបួន (តាមលំដាប់មិនច្បាស់លាស់នៃចំណូលចិត្ត ទេ ព័ត៌មានបន្ថែមអំពីតម្រូវការរបស់អ្នក)៖

    កំណត់រចនាសម្ព័ន្ធ Datepicker ដើម្បីផ្តល់កាលបរិច្ឆេទក្នុងទម្រង់ដែលបានគាំទ្រដោយប្រើ altField រួមជាមួយ altFormat៖

    $("selector").datepicker(( altField: "#actualDate" altFormat: "yyyy-mm-dd" ));

    ឬប្រសិនបើអ្នកសប្បាយចិត្តដែលអ្នកប្រើប្រាស់ឃើញកាលបរិច្ឆេទក្នុងទម្រង់ YYYY-MM-DD គ្រាន់តែកំណត់ប៉ារ៉ាម៉ែត្រទម្រង់កាលបរិច្ឆេទជំនួសវិញ៖

    $("អ្នកជ្រើសរើស").datepicker(( dateFormat: "yyyy-mm-dd" ));

  • $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))

  • បញ្ចូលខ្សែអក្សរដោយដៃទៅជាព្យញ្ជនៈត្រឹមត្រូវ៖

    $parts = explode("/", $_POST["date"]); $date = "$parts-$parts-$parts";

ការព្រមាន

    កូដរបស់អ្នកងាយរងគ្រោះនឹងការចាក់ SQL ។អ្នកពិតជាគួរប្រើសេចក្តីថ្លែងការណ៍ដែលបានរៀបចំ ដែលអ្នកឆ្លងកាត់អថេររបស់អ្នកជាប៉ារ៉ាម៉ែត្រដែលមិនត្រូវបានវាយតម្លៃទៅ SQL ។ ប្រសិនបើអ្នកមិនដឹងថាខ្ញុំកំពុងនិយាយអំពីអ្វី ឬរបៀបជួសជុលវា សូមអានរឿង Bobby Tables ។

  • ប្រភេទ 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" ។

ដូច្នេះ ប្រភេទទិន្នន័យប្រតិទិនទាំងអស់ត្រូវបានពិពណ៌នាលម្អិតនៅក្នុងផ្នែក “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 បៃ។
ចំណាំទៅម្ចាស់ផ្ទះ. វាគួរឱ្យចាប់អារម្មណ៍ដែលអ្នកសរសេរកម្មវិធីភាគច្រើនជឿថាគំនិតនៃ "ត្រាពេលវេលា" គឺជាពេលវេលាយូនីក។ តាមពិត ត្រាពេលវេលាគឺជាសញ្ញាសម្គាល់ដែលជាលំដាប់នៃតួអក្សរដែលបង្ហាញពីកាលបរិច្ឆេទ និង/ឬពេលវេលានៅពេលដែលព្រឹត្តិការណ៍ជាក់លាក់មួយបានកើតឡើង។ ហើយ "ពេលវេលាយូនីក" (ពេលវេលាយូនីក) ឬពេលវេលា POSIX គឺជាចំនួនវិនាទីដែលបានកន្លងផុតទៅចាប់តាំងពីពាក់កណ្តាលអធ្រាត្រថ្ងៃទី 1 ខែមករាឆ្នាំ 1970 UTC ។ គោលគំនិតនៃពេលវេលាត្រាគឺទូលំទូលាយជាងពេលវេលាយូនីក។

បន្ទាប់ពីការវិភាគការពិពណ៌នានៃប្រភេទដែលបានបង្ហាញខាងលើអ្នកអាចទាញការសន្និដ្ឋានស្ទើរតែទាំងអស់អំពីគុណសម្បត្តិនិងគុណវិបត្តិនៃប្រភេទមួយចំនួន។ អ្វីគ្រប់យ៉ាងគឺសាមញ្ញនិងជាក់ស្តែង។

ប៉ុន្តែមុននឹងនិយាយអំពីការប្រើប្រាស់ប្រភេទទាំងនេះ ខ្ញុំចង់កត់សម្គាល់ថានៅក្នុងការអនុវត្ត ប្រភេទមួយផ្សេងទៀតត្រូវបានគេប្រើជាញឹកញាប់ដើម្បីរក្សាទុកកាលបរិច្ឆេទ និងពេលវេលា៖ តម្លៃចំនួនគត់ (សម្រាប់រក្សាទុកកាលបរិច្ឆេទ - 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 ខែមករាយោងទៅតាមម៉ោងក្នុងស្រុក មិនចាំបាច់បកប្រែអ្វីនៅទីនេះទេ។

ដើម្បីចាប់ផ្តើម ខ្ញុំចង់ប៉ះលើប្រធានបទនៃទម្រង់ណាដែលល្អបំផុតដើម្បីរក្សាទុកកាលបរិច្ឆេទនៅក្នុងមូលដ្ឋានទិន្នន័យ៖ TIMESTAMPDATETIME. សំណួរ​នេះ​បាន​និង​កំពុង​ត្រូវ​បាន​លើក​ឡើង​ជា​ច្រើន​ដង​នៅ​លើ​វេទិកា ប្លក់ ជាដើម។ ប៉ុន្តែដើម្បីកុំឱ្យអ្នកបញ្ជូនអ្នកទៅកាន់ម៉ាស៊ីនស្វែងរកភ្លាមៗ ខ្ញុំនឹងព្យាយាម នៅក្នុងពាក្យសាមញ្ញហើយបង្ហាញភាពខុសគ្នាជាមួយឧទាហរណ៍។ ប្រភេទ 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សម្រាប់ធ្វើការជាមួយកាលបរិច្ឆេទនៅក្នុងអត្ថបទនេះនឹងជួយអ្នករុករកស្ថានភាព និងធ្វើការសម្រេចចិត្តត្រឹមត្រូវ។ ប្រសិនបើ​ការ​លំបាក​នៅ​តែ​កើត​ឡើង​បន្ទាប់​មក​សួរ​សំណួរ​ក្នុង​ប្រធាន​បទ​នេះ ឬ​ផ្នែក "សំណួរ​របស់​អ្នក"។ យើងនឹងដោះស្រាយជាមួយគ្នា ;)