تصميم موقع الويب الخاص بك مع PHP و MySQL


الدرس: التواريخ في SQL


الصفحة السابقة
عندما أنشأنا جداولنا ، استخدمنا أنواعًا مختلفة من الحقول ، بما في ذلك INT (عدد ) ،  VARCHAR (نص القصير ) و  TEXT (نص الطويل) . ربما اكتشفت في phpMyAdmin أن هناك العديد من الأنواع الأخرى. معظمها مجرد أشكال من هذه الأنواع ، على سبيل المثال ، لتخزين أعداد صغيرة جدًا أو كبيرة جدًا. في معظم الأوقات ، لن تضطر إلى القلق بشأن جميع هذه الأنواع : INTيكفي للأعداد الصحيحة على سبيل المثال.

يعد التعامل مع التواريخ أكثر صعوبة في SQL ، ومع ذلك فنحن نحتاج إليها في أغلب الأحيان. على سبيل المثال ، في مشروع الدردشة المصغرة ، يمكن استخدامه لتخزين اليوم والوقت بدقة عند نشر كل رسالة. ينطبق الأمر نفسه إذا كنت تقوم بإنشاء منتدى أو نظام إخباري لموقعك: ستحتاج إلى تسجيل التاريخ في كل مرة.

سنقوم أولاً برؤية أنواع الحقول التي يجب عليك معرفتها لتخزين التواريخ باستخدام MySQL وسنرى كيفية استخدامها. يمكننا بعد ذلك اكتشاف وظائف SQL جديدة مخصصة للتواريخ.

الحقول من نوع تاريخ (Date)


في هذا الفصل ، أقترح عليك تحسين مشروع الدردشة المُصغّرة التي أنشأناها في المختبر السابق.

هل تعلم أنه من الممكن تعديل هيكل الجدول بعد إنشائه؟ يمكنك بالفعل إضافته (الشكل التالي) أو حذف الحقول في أي وقت. افتح الجدول minichat في phpMyAdmin ، علامة التبويب ""Structure . ابحث في النموذج "Add " في أسفل الصفحة وانقر على زر ""Go .
web dynamique php
إضافة حقل في phpMyAdmin
كما يظهر النموذج يطلب منك إنشاء حقل جديد. هذه فرصة لمراجعة أنواع الحقول المختلفة التي تتيح لك تخزين التواريخ.
أنواع مختلفة من التواريخ
فيما يلي الأنواع المختلفة من التواريخ التي يمكن لـ MySQL تخزينها:
  • DATE  : يخزن تاريخ بالتنسيق YYYY-MM-DD (سنة - شهر - يوم) ؛
  • TIME  : يخزن الوقت بتنسيق HH: MM: SS (الساعات: الدقائق: الثواني) ؛
  • DATETIME  : يخزن مزيج من التاريخ والوقت من اليوم بالتنسيق YYYY-MM-DD HH: MM: SS . هذا النوع من المجال هو بالتالي أكثر دقة.
  • TIMESTAMP  : يخزن عدد الثواني التي مرت منذ 1 يناير 1970 في الساعة 00:00 00 دقيقة 00 ثانية ؛
  • YEAR  : يخزن في السنة ، إما بتنسيق AA أو بتنسيق AAAA .
هذا الكثير من الخيارات! في الممارسة العملية ، أدعوك أن تتذكر بشكل خاص DATE(YYYY-MM-DD) عندما لا يكون وقت اليوم مهمًا ، و  DATETIME (YYYY-MM-DD HH: MM: SS) عندما تحتاج إلى اليوم والساعة دقيقة إلى الثانية.
قم بإنشاء حقل مسمى  date من النوع  DATETIME كما في الشكل التالي ، ووضعه في CURRENT_TIMESTAMP
web dynamique php
إنشاء حقل تاريخ
على الرغم من أنه يعمل مع MySQL ، فمن الأفضل في بعض الأحيان إعطاء الحقل اسمًا مختلفًا عن date . في الواقع ، إنها كلمة أساسية في SQL ، والتي يمكن أن تسبب أخطاء في أنظمة قواعد البيانات الأخرى مثل Oracle .
يمكنك على سبيل المثال تسمية الحقل مثل هذا: ،   date_creation أو مرة أخرى date_modification .
استخدام حقول التاريخ في SQL
تُستخدم حقول الكتابة Date كسلسلة: يجب أن تحيط بها الفواصل العليا. يجب عليك كتابة التاريخ بتنسيق الحقل.
على سبيل المثال ، بالنسبة لحقل النوع DATE  :

SELECT pseudo, message, date FROM minichat WHERE date = '2010-04-02'
... سوف نرسل لك قائمة الرسائل المنشورة في 02/04/2010 (2 أبريل 2010).
إذا كان الحقل من النوع DATETIME (كما هو الحال في الدردشة المصغرة الجديدة) ، فيجب عليك أيضًا تحديد الساعات والدقائق والثواني بالتحديد:

SELECT pseudo, message, date FROM minichat WHERE date = '2010-04-02 15:28:22'
سيعيد هذا قائمة الرسائل المنشورة في 02/04/2010 الساعة 15:30 مساءً.
جيد: أدرك أنه دقيق بعض الشيء ، فمن غير المرجح أن يتم نشر العديد من الرسائل في هذه اللحظة بالتحديد.
من ناحية أخرى ، وهذا هو المكان الذي تصبح فيه حقول التاريخ مثيرة للاهتمام حقًا ، يمكنك استخدام عوامل تشغيل أخرى غير علامة المساواة. على سبيل المثال ، يمكننا الحصول على قائمة بجميع الرسائل المنشورة بعد هذا التاريخ:

SELECT pseudo, message, date FROM minichat WHERE date >= '2010-04-02 15:28:22'
أو حتى قائمة بجميع الرسائل المنشورة بين 02/04/2010 و 18/04/2010:

SELECT pseudo, message, date FROM minichat WHERE date >= '2010-04-02 00:00:00' AND date <= '2010-04-18 00:00:00'
في SQL ، لاستعادة البيانات بين فواصل زمنية ، كما هو الحال هنا ، يوجد بناء جملة أكثر بساطة وأكثر أناقة مع الكلمة الأساسية BETWEEN التي تعني "بين" . يمكننا كتابة الطلب السابق مثل هذا:

SELECT pseudo, message, date FROM minichat WHERE date BETWEEN '2010-04-02 00:00:00' AND '2010-04-18 00:00:00'
هذا يعني: "استرداد جميع الرسائل بتاريخ بين 2010-04-02 00:00:00 و 2010-04-18 00:00:00". يمكنك أيضًا استخدام بناء الجملة هذا في الحقول التي تحتوي على أرقام.
إذا كنت تريد إدراج إدخال يحتوي على تاريخ ، يكفي هنا مرة أخرى احترام تنسيق التاريخ لقاعدة البيانات:

INSERT INTO minichat(pseudo, message, date) VALUES('Mateo', 'Message !', '2010-04-02 16:32:22')

وظائف إدارة التاريخ


هناك العديد من الوظائف لمعالجة التواريخ. تُستخدم في حقول الكتابة DATE أو DATETIME على سبيل المثال ، تجعل من السهل للغاية استخراج جميع أنواع المعلومات المفيدة في التواريخ ، مثل السنة ، ورقم يوم الشهر ، ورقم اليوم في السنة ، إلخ. من الممكن أيضًا إجراء عمليات في التواريخ.
يستحيل سرد جميع وظائف إدارة التاريخ ، ولكن ستجد قائمة كاملة بها في وثائق MySQL إذا لزم الأمر. يجب أن تكون هذه المقدمة إلى التواريخ كافية لك لإدارة بنفسك بعد ذلك.
NOW()  : الحصول على التاريخ والوقت الحالي
ربما تكون هذه إحدى الوظائف التي ستستخدمها في أغلب الأحيان. عندما تقوم بإدراج رسالة جديدة في الأساس ، ستحتاج إلى حفظ التاريخ الحالي بنسبة 99٪ من الوقت. لا شيء يمكن أن يكون أكثر بساطة مع الوظيفة NOW()  :

INSERT INTO minichat(pseudo, message, date) VALUES('Mateo', 'Message !', NOW())
سيتم استبدال التاريخ تلقائيًا بالتاريخ والوقت الحالي بالتنسيق YYYY-MM-DD HH: MM: SS .
علما بأن هناك أيضا وظائف CURDATE() و CURTIME() العودة على التوالي فقط من تاريخ ( YYYY-MM-DD ) والوقت ( HH: MM: SS ) .
DAY() ، MONTH() ، YEAR()  : استخراج اليوم أو الشهر أو السنة
استخراج المعلومات من تاريخ؟ هذا سهل ! هنا مثال على الاستخدام:

SELECT pseudo, message, DAY(date) AS jour FROM minichat
سنقوم باسترداد ثلاثة حقول: الاسم المستعار والرسالة ورقم اليوم الذي تم نشره فيه.
HOUR()، MINUTE()، SECOND()  : استخراج الساعات والدقائق والثواني
بنفس الطريقة ، مع هذه الوظائف ، يمكن استخراج الساعات والدقائق والثواني من حقل الكتابة DATETIMEأو TIME .

SELECT pseudo, message, HOUR(date) AS heure FROM minichat
DATE_FORMAT  : تنسيق التاريخ
من خلال الوظائف التي اكتشفناها للتو ، يمكننا استخراج جميع عناصر التاريخ ، مثل هذا:

SELECT pseudo, message, DAY(date) AS jour, MONTH(date) AS mois, YEAR(date) AS annee, HOUR(date) AS heure, MINUTE(date) AS minute, SECOND(date) AS seconde FROM minichat
يمكننا بعد ذلك عرض التاريخ في PHP بالترتيب الذي نريده باستخدام تصنيف الحقل الذي قمنا به للتو:

<?php
echo $donnees['jour'] . '/' . $donnees['mois'] . '/' . $donnees['annee'] . '...';
?>
ومع ذلك ، فهي معقدة بعض الشيء ، وهناك أبسط.  DATE_FORMAT تتيح لك الوظيفة تكييف التاريخ مباشرة مع التنسيق الذي تفضله. يجب القول أن التنسيق الافتراضي لـ MySQL (YYYY-MM-DD HH: MM: SS) ليس شائعًا جدًا.
إليك كيف يمكننا استخدامه:

SELECT pseudo, message, DATE_FORMAT(date, '%d/%m/%Y %Hh%imin%ss') AS date FROM minichat
وبالتالي ، سوف  نسترجع التواريخ بحقل اسمه date في النموذج 11/03/2010 15h47min49s.
كيف يعمل هذا البازار؟
الرموز  %d، %m، %Y (الخ) والاستعاضة عنها اليوم والشهر والسنة، وما إلى ذلك يتم عرض الرموز والحروف الأخرى كما هي.
هناك العديد من الرموز الأخرى لاستخراج اسم اليوم على سبيل المثال (معظمها باللغة الإنجليزية للأسف ، مثل "السبت") ، وعدد اليوم في السنة ، إلخ. قائمة الرموز المتاحة موجودة في المستند الموجود في القسم DATE_FORMAT  .
DATE_ADDو DATE_SUB  : إضافة أو طرح التواريخ
من الممكن إضافة أو طرح ساعات أو دقائق أو ثوان أو أيام أو أشهر أو سنوات حتى الآن. يجب إرسال مُدخلين إلى الوظيفة: تاريخ العمل والرقم المراد إضافته بالإضافة إلى نوعه.
على سبيل المثال ، افترض أنك تريد عرض تاريخ انتهاء صلاحية الرسالة. هذا يتوافق مع "تاريخ نشر الرسالة + 15 يومًا" . إليك كيفية كتابة الاستعلام:

SELECT pseudo, message, DATE_ADD(date, INTERVAL 15 DAY) AS date_expiration FROM minichat
الحقل date_expiration يتوافق مع "تاريخ الدخول + 15 يوم" .  لا ينبغي تغيير الكلمة الرئيسية INTERVAL ؛ ومع ذلك، يمكنك استبدال  DAY من قبل MONTH ، YEAR، HOUR، MINUTE، SECOND، الخ لذلك ، إذا كنت تريد الإشارة إلى أن الرسائل تنتهي صلاحيتها خلال شهرين:
message, DATE_ADD(date, INTERVAL 2 MONTH) AS date_expiration FROM minichat

في الخلاصة


  • يوفر MySQL عدة أنواع من الحقول لتخزين التواريخ.
  • النوعان الأكثر شيوعًا هما:
    • DATE  : يخزن تاريخًا بتنسيق YYYY-MM-DD ؛
    • DATETIME  : يخزن التاريخ والوقت بتنسيق YYYY-MM-DD HH: MM: SS .
  • يمكنك فرز الحقول التي تحتوي على التواريخ وتصفيتها كما لو كانت أرقامًا.
  • هناك العديد من وظائف SQL مخصصة لمعالجة التواريخ. الأكثر شهرة هو NOW() الذي يعود التاريخ والوقت الحالي.