شرح صفوف ومحتوى الفقرة
عند تصفية الأعمدة الزمنية، يجب التمييز بدقة بين أعمدة التاريخ فقط 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';