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

Date and Timestamp Range Filtering تصفية النطاقات الزمنية والتواريخ

رشّح أعمدة DATE و DATETIME بدقة وتجنّب مشكلة استبعاد ساعات اليوم الأخير عند استخدام BETWEEN.
1 صفوف تعليمية
MySQL
7 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

عند تصفية الأعمدة الزمنية، يجب التمييز بدقة بين أعمدة التاريخ فقط DATE وأعمدة التاريخ مع الوقت DATETIME أو TIMESTAMP.

  • أعمدة DATE: يعمل الشرط order_date BETWEEN '2026-03-01' AND '2026-03-31' بشكل مثالي ويشمل جميع أيام شهر مارس بالكامل.
  • مشكلة منتصف الليل مع DATETIME: عند تمرير تاريخ بدون وقت مثل '2026-03-31' لعمود DATETIME، يحوّله MySQL تلقائياً إلى '2026-03-31 00:00:00' فيستبعد جميع العمليات التي حدثت خلال ساعات يوم 31 مارس! لذا حدّد وقت نهاية اليوم صراحةً أو استخدم نطاقاً نصف مفتوح >= '2026-03-01' AND < '2026-04-01'.

يضمن النطاق نصف المفتوح شمول كافة أجزاء الثانية حتى في أعمدة الدقة العالية DATETIME(6).

SQL
-- Explicit full-day DATETIME bounds with BETWEEN
SELECT event_id, event_type, created_at
FROM audit_events
WHERE created_at BETWEEN '2026-03-01 00:00:00'
                     AND '2026-03-31 23:59:59';