انتقل إلى محتوى الدرس
الدرس 36
دورة MySQL

دوال التاريخ والوقت وحساب الفروق الزمنية وتنسيقها في MySQLMySQL Date and Time Functions

تعلّم دوال التاريخ والوقت وحساب الفروق الزمنية وتنسيقها في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
7
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

لقراءة التاريخ أو الوقت الحالي لخادم قاعدة البيانات داخل الاستعلام، يوفر MySQL 8 مجموعة دوال زمنية قياسية:

  • دالة NOW() (أو CURRENT_TIMESTAMP): تعيد التاريخ والوقت معاً بصيغة 'YYYY-MM-DD hh:mm:ss' حسب المنطقة الزمنية للجلسة، وتثبت قيمتها عند لحظة بدء تنفيذ الاستعلام.
  • دالتا CURDATE() وCURTIME(): تعيد الأولى التاريخ الحالي فقط، وتعيد الثانية الوقت الحالي فقط.
  • دالتا UTC_DATE() وUTC_TIMESTAMP(): تعيدان التوقيت العالمي المنسق UTC مباشرة بغض النظر عن المنطقة الزمنية المحلية للخادم.
مخطط يوضح دوال التوقيت الحالي NOW و CURDATE واستخراج الأجزاء وإضافة الفترات وحساب الفروق وتنسيق التواريخ في MySQL 8
SQL
SELECT
  NOW() AS current_dt,
  CURDATE() AS today_date,
  CURTIME() AS current_clock,
  UTC_TIMESTAMP() AS utc_dt;

عند تجميع المبيعات حسب السنة أو الشهر أو الربع المالي، أو استخلاص جزء محدد من عمود تاريخ، نستخدم دوال استخراج الأجزاء الزمنية:

  • دوال YEAR(dt) وMONTH(dt) وDAY(dt): تعيد السنة كعدد صحيح، أو رقم الشهر (1..12)، أو يوم الشهر (1..31).
  • دوال HOUR(dt) وMINUTE(dt) وSECOND(dt): لاستخراج الساعة والدقيقة والثانية.
  • الدالة القياسية EXTRACT(unit FROM dt): تدعم استخراج وحدات مفردة أو مركبة مثل QUARTER أو YEAR_MONTH (مثل 202611).
SQL
SELECT
  order_id,
  YEAR(created_at) AS order_year,
  MONTH(created_at) AS order_month,
  DAY(created_at) AS order_day,
  EXTRACT(YEAR_MONTH FROM created_at) AS ym_code
FROM orders;

لحساب تاريخ انتهاء الاشتراك أو موعد الاستحقاق بدقة تراعي اختلاف عدد أيام الشهور والسنوات الكبيسة، نستخدم دوال الحساب الزمني مع الكلمة المفتاحية INTERVAL:

  • دالة الإضافة DATE_ADD(date, INTERVAL expr unit): تضيف فترة زمنية محددة مثل INTERVAL 7 DAY أو INTERVAL 3 MONTH أو INTERVAL 1 YEAR إلى التاريخ.
  • دالة الطرح DATE_SUB(date, INTERVAL expr unit): تطرح الفترة الزمنية المحددة من التاريخ (مثلاً جلب طلبات آخر 30 يوماً).
  • دالة LAST_DAY(date): تعيد تاريخ آخر يوم في الشهر تلقائياً.
SQL
SELECT
  subscription_id,
  start_date,
  DATE_ADD(start_date, INTERVAL 1 YEAR) AS expires_on,
  DATE_SUB(CURDATE(), INTERVAL 30 DAY) AS thirty_days_ago,
  LAST_DAY(start_date) AS billing_month_end
FROM subscriptions;

لقياس الفارق الزمني بين تاريخين أو طابعين زمنيين، يوفر MySQL دالتين متخصصتين يجب الانتباه لترتيب المعاملات في كل منهما:

  • دالة فرق الأيام DATEDIFF(expr1, expr2): تحسب ناتج الطرح expr1 - expr2 بالأيام الكاملة فقط مع تجاهل الساعات والدقائق؛ وتكون النتيجة موجبة إذا كان التاريخ الأول أحدث من الثاني.
  • دالة الفرق المحدد بالوحدة TIMESTAMPDIFF(unit, start_dt, end_dt): تحسب الفارق end_dt - start_dt بالوحدة التي تختارها مثل HOUR أو MINUTE أو MONTH أو YEAR.
SQL
SELECT
  invoice_id,
  DATEDIFF(due_date, issued_date) AS net_payment_days,
  TIMESTAMPDIFF(HOUR, created_at, shipped_at) AS fulfillment_hours,
  TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS customer_age
FROM invoices;

يخزن MySQL جميع التواريخ داخلياً بالصيغة القياسية YYYY-MM-DD. وعندما نريد عرض التاريخ بصيغة مخصصة للتقارير أو الواجهات نستخدم دالة DATE_FORMAT(date, format) مع رموز التنسيق:

  • الرمزان %Y و%y: السنة من 4 أرقام (2026) أو من رقمين (26).
  • الرموز %m و%M و%b: رقم الشهر من خانتين (01..12)، أو اسم الشهر الكامل، أو المختصر.
  • الرموز %d و%H و%i و%s: رقم اليوم، والساعة بنظام 24 ساعة، والدقائق، والثواني.
SQL
SELECT
  order_id,
  DATE_FORMAT(created_at, '%Y-%m-%d') AS iso_date,
  DATE_FORMAT(created_at, '%d/%m/%Y %H:%i') AS arab_display,
  STR_TO_DATE('15-11-2026', '%d-%m-%Y') AS parsed_date
FROM orders;

يلخص الجدول المرجعي التالي أهم دوال التاريخ والوقت وحساب الفروق الزمنية في MySQL 8:

الدالة الزمنيةالوظيفة الأساسيةمثال الاستدعاءالنتيجة
NOW() / CURDATE()التوقيت أو التاريخ الحاليCURDATE()'2026-11-08'
EXTRACT(unit FROM d)استخراج جزء من التاريخEXTRACT(YEAR FROM d)2026
DATE_ADD(d, INTERVAL)إضافة فترة زمنيةDATE_ADD(d, INTERVAL 7 DAY)إضافة 7 أيام
DATEDIFF(d1, d2)حساب فرق الأيام d1 - d2DATEDIFF('2026-11-10','2026-11-01')9
TIMESTAMPDIFF(u,s,e)حساب الفرق e - s بالوحدةTIMESTAMPDIFF(HOUR, s, e)عدد الساعات
DATE_FORMAT(d, fmt)تنسيق عرض التاريخ كنصDATE_FORMAT(d, '%Y/%m/%d')'2026/11/08'
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتقنت في هذا الدرس دوال التوقيت الحالي NOW() وCURDATE()، واستخراج أجزاء التاريخ عبر EXTRACT()، وإضافة وطرح الفترات الزمنية بـ DATE_ADD() وDATE_SUB()، وحساب الفروق الزمنية بـ DATEDIFF() وTIMESTAMPDIFF()، وتنسيق عرض التواريخ بـ DATE_FORMAT().

الخطوة التالية والدرس القادم

انتقل الآن إلى الدرس السابع والثلاثين «التعبيرات الشرطية CASE و COALESCE وتحويل الأنواع CAST في MySQL» لبناء الشروط المنطقية وتحويل الأنواع داخل الاستعلامات.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Date Functions دوال التاريخ
تعلّم دوال التاريخ والوقت وحساب الفروق الزمنية وتنسيقها في MySQL بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
للمراجعة
02 Current Date and Time Functions دوال الوقت والتاريخ الحالي
المفهوم الهندسي وصياغة استعلام SQL القياسية لقسم دوال الوقت والتاريخ الحالي في MySQL 8.
للمراجعة
03 Extracting Year Month and Day استخراج أجزاء التاريخ EXTRACT
المفهوم الهندسي وصياغة استعلام SQL القياسية لقسم استخراج أجزاء التاريخ EXTRACT في MySQL 8.
للمراجعة
04 Adding Intervals with DATE ADD إضافة وطرح الفترات الزمنية
المفهوم الهندسي وصياغة استعلام SQL القياسية لقسم إضافة وطرح الفترات الزمنية في MySQL 8.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 UTC UTC
Coordinated Universal Time
التوقيت العالمي المنسق القياسي الذي تعيده دالتا UTC_TIMESTAMP() و UTC_DATE() في MySQL.
للمراجعة
02 ISO ISO
ISO 8601 Date Format (YYYY-MM-DD)
الصيغة القياسية العالمية للتواريخ (YYYY-MM-DD) المعتمدة داخلياً في MySQL.
للمراجعة
03 SLA SLA
Service Level Agreement
اتفاقية مستوى الخدمة وتُقاس مدة الاستجابة فيها عبر دالة TIMESTAMPDIFF.
للمراجعة
04 DST DST
Daylight Saving Time
التوقيت الصيفي الموسمي الذي تتجنب قواعد البيانات مشاكله عبر اعتماد التوقيت العالمي UTC.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. نفّذ استعلامات SQL المشروحة في قسم دوال الوقت والتاريخ الحالي داخل قاعدة بيانات MySQL 8 المحلية وتأكد من مطابقة النتائج.

  2. بدّل بين الحالات الثلاث في المحاكي التفاعلي ضمن قسم استخراج أجزاء التاريخ EXTRACT وقارن مخرجات الاستعلام.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

8أسئلة 3أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي8 أسئلة تنتظرك
01

أي دالة في MySQL تعيد التاريخ الحالي فقط بصيغة "YYYY-MM-DD" دون جزء الساعات والدقائق؟

تعيد دالة CURDATE() التاريخ الحالي فقط دون الوقت.

02

ما هي القيمة التي تعيدها الدالة EXTRACT(YEAR FROM "2026-11-08") في MySQL؟

تستخرج الدالة جزء السنة الرباعية فتكون النتيجة 2026.

03

أي تعبير مما يلي يضيف 15 يوماً بشكل صحيح إلى عمود التاريخ order_date في MySQL؟

الصيغة القياسية لإضافة فترة زمنية هي DATE_ADD(order_date, INTERVAL 15 DAY).

04

ما هي نتيجة الاستعلام SELECT DATEDIFF("2026-11-15", "2026-11-05"); في MySQL؟

تحسب دالة DATEDIFF الفرق بطرح التاريخ الثاني من الأول بالأيام فتكون النتيجة 10.

05

تتجاهل دالة DATEDIFF(expr1, expr2) جزء الساعات والدقائق وتحسب الفرق بين جزأي التاريخ فقط بالأيام.

صواب؛ تعتمد DATEDIFF على جزء التاريخ فقط، ولحساب الساعات والدقائق نستخدم TIMESTAMPDIFF.

06

في دالة DATE_FORMAT، ما هما رمزا التنسيق لعرض السنة من 4 أرقام والشهر من رقمين؟

يرمز %Y للسنة من 4 أرقام، ويرمز %m لرقم الشهر من خانتين (01..12).

07

تعيد الدالة LAST_DAY("2026-02-10") التاريخ "2026-02-28" الذي يمثل آخر يوم في ذلك الشهر تلقائياً.

صواب؛ تستخرج دالة LAST_DAY تاريخ آخر يوم في الشهر بدقة.

08

ما هما الدالتان اللتان تعيدان الطابع الزمني الحالي بالتوقيت المحلي للجلسة أو بالتوقيت العالمي UTC؟ (اختر إجابتين)

تعيد NOW() التوقيت الحالي للجلسة وتعيد UTC_TIMESTAMP() التوقيت العالمي المنسق.