اقتطاع التواريخ وتجميعها في فئات
التجميع حسب الأسبوع والشهر والربع باستخدام DATE_TRUNC وما يعادله
اقتطاع التواريخ وتجميعها في فئات درس مجاني في Coding Interview Prep على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Coding Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
لماذا يُسأل عن تجميع التواريخ
«إظهار الإيرادات حسب الأسبوع» أو «المستخدمون النشطون حسب الشهر» من أساسيات مقابلات محللي البيانات. والمهارة التي يجري اختبارها هي تحويل الطوابع الزمنية الدقيقة إلى حاويات زمنية أقل دقة، بحيث تتجمع الصفوف معًا.
الخطأ الذي يقع فيه المبتدئون هو استخراج رقم الشهر فقط، مما يدمج الشهر نفسه عبر سنوات مختلفة. أما الإجابة الاحترافية فهي الاقتطاع: تحويل كل طابع زمني إلى بداية الفترة الخاصة به.
- حاويات الأسابيع والأشهر والأرباع والسنوات
DATE_TRUNCوما يعادله في اللهجات الأخرى- التجميع بطريقة صحيحة حتى تتطابق المخططات
DATE_TRUNC: الأداة الأساسية
في PostgreSQL، تعمل DATE_TRUNC(unit, ts) على تصفير كل ما هو أدق من الوحدة المحددة. فعند الاقتطاع إلى 'month'، يتحول أي طابع زمني في شهر مارس إلى 2024-03-01 00:00:00.
وتظل القيمة الناتجة طابعًا زمنيًا، ولذلك تُرتّب ترتيبًا زمنيًا وتُجمّع بصورة مثالية. وهذه هي دالة التاريخ الأكثر فائدة لإعداد التقارير.
SELECT DATE_TRUNC('month', TIMESTAMP '2024-03-17 14:30:00');
-- 2024-03-01 00:00:00تجميع الإيرادات حسب الشهر
هذا هو المثال التطبيقي الأساسي. اقتطع الطابع الزمني إلى الشهر، ثم جمّع القيم واحسب مجموعها. وبما أن الحاوية تتضمن السنة، فسيظل يناير 2023 منفصلًا عن يناير 2024.
ويؤدي الترتيب حسب القيمة المقتطعة إلى إنشاء سلسلة زمنية واضحة جاهزة للعرض في مخطط.
SELECT
DATE_TRUNC('month', order_ts) AS month,
SUM(amount) AS revenue
FROM orders
GROUP BY 1
ORDER BY 1;EXTRACT في مقابل DATE_TRUNC
يختبر المحاورون هذا الفرق مباشرة. فكلاهما يستخرج معلومات عن الفترة، لكن كلًا منهما يجيب عن سؤال مختلف.
- تعيد
EXTRACT(MONTH FROM ts)الرقم 3 لأي شهر مارس، عبر جميع السنوات، ولذلك فهي مفيدة لتحليل الموسمية. - تعيد
DATE_TRUNC('month', ts)بداية الشهر المحدد، مع إبقاء السنوات منفصلة، ولذلك فهي مفيدة للسلاسل الزمنية.
إذا جمّعت باستخدام EXTRACT(MONTH ...) لإنشاء مخطط اتجاه شهري، فستدمج السنوات معًا دون تنبيهك إلى ذلك.
-- Seasonality: which month is busiest on average?
SELECT EXTRACT(MONTH FROM order_ts) AS month_num, COUNT(*)
FROM orders GROUP BY 1 ORDER BY 1;
-- Time series: month-by-month trend (years kept separate)
SELECT DATE_TRUNC('month', order_ts) AS month, COUNT(*)
FROM orders GROUP BY 1 ORDER BY 1;حاويات الأسابيع وسؤال يوم الاثنين
يخفي التجميع الأسبوعي تفصيلًا دقيقًا يستمتع المحاورون باختباره: متى يبدأ الأسبوع؟ تعمل PostgreSQL's DATE_TRUNC('week', ts) دائمًا على تقريب التاريخ إلى يوم الاثنين (أسابيع ISO).
إذا كان المطلوب في سياق العمل هو أن تبدأ الأسابيع يوم الأحد، فعليك إجراء إزاحة. ومن الأساليب الشائعة إرجاع التاريخ يومًا واحدًا إلى الخلف، ثم اقتطاعه، ثم إزاحته يومًا إلى الأمام.
-- ISO week (Monday start)
SELECT DATE_TRUNC('week', order_ts) AS iso_week FROM orders;
-- Sunday-start week
SELECT DATE_TRUNC('week', order_ts + INTERVAL '1 day') - INTERVAL '1 day'
AS sunday_week
FROM orders;حاويات الأرباع
تُعد التقارير ربع السنوية شائعة في الأدوار المرتبطة بالقطاع المالي. تعمل DATE_TRUNC('quarter', ts) على تحويل أي طابع زمني إلى اليوم الأول من ربعه: 1 يناير أو 1 أبريل أو 1 يوليو أو 1 أكتوبر.
ولإظهار الربع على هيئة رقم بدلًا من ذلك، ادمج EXTRACT(QUARTER ...) مع السنة.
SELECT
DATE_TRUNC('quarter', order_ts) AS quarter_start,
EXTRACT(YEAR FROM order_ts) || '-Q'
|| EXTRACT(QUARTER FROM order_ts) AS quarter_label,
SUM(amount) AS revenue
FROM orders
GROUP BY 1, 2
ORDER BY 1;لا تحتوي MySQL على DATE_TRUNC
من الأسئلة الشائعة التي تقارن بين اللهجات: «لا تحتوي MySQL على DATE_TRUNC، فكيف تُجمّع البيانات حسب الشهر؟» والإجابة القابلة للنقل بين الأنظمة هي تنسيق التاريخ حتى مستوى الدقة المطلوب.
- تعطي
DATE_FORMAT(ts, '%Y-%m-01')بداية الشهر كنص أو تاريخ. - تعطي
DATE_FORMAT(ts, '%Y-%m')مفتاحًا نصيًا قابلًا للترتيب مثل2024-03.
وبالنسبة إلى الأسبوع، توفر MySQL الدالة YEARWEEK() مع وسيط نمط يتحكم في يوم بداية الأسبوع.
-- MySQL month bucket
SELECT DATE_FORMAT(order_ts, '%Y-%m-01') AS month, SUM(amount)
FROM orders
GROUP BY 1
ORDER BY 1;التجميع حسب الفترات في SQL Server
لم يتوفر في SQL Server تاريخيًا أسلوب مباشر للاقتطاع، ولذلك كان المرشحون يستخدمون DATEFROMPARTS أو الأسلوب الاصطلاحي DATEADD/DATEDIFF. أما الإصدارات الحديثة (2022 وما بعدها) فأضافت DATETRUNC.
ويعمل الأسلوب الاصطلاحي الكلاسيكي «احسب الوحدات منذ حقبة البداية، ثم أعد إضافتها» في كل الإصدارات، ومن المفيد معرفة كيفية استخدامه.
-- Portable SQL Server month truncation
SELECT DATEADD(month, DATEDIFF(month, 0, order_ts), 0) AS month_start
FROM orders;
-- SQL Server 2022+
SELECT DATETRUNC(month, order_ts) AS month_start FROM orders;ملء الفجوات في سلسلة زمنية
لا يكفي الاقتطاع وحده، لأنه يحذف الفترات التي لا تحتوي على صفوف: فالشهر الذي لم تُسجَّل فيه أي طلبات لن يظهر على الإطلاق. ويختبر المحاورون ما إذا كنت ستنتبه إلى ذلك.
والحل هو إنشاء محور كامل للفترات، ثم إجراء LEFT JOIN للبيانات عليه. وفي Postgres، تنشئ generate_series هذا المحور.
SELECT
cal.month,
COALESCE(SUM(o.amount), 0) AS revenue
FROM generate_series(DATE '2024-01-01', DATE '2024-12-01',
INTERVAL '1 month') AS cal(month)
LEFT JOIN orders o
ON DATE_TRUNC('month', o.order_ts) = cal.month
GROUP BY cal.month
ORDER BY cal.month;مثال أعمق: المستخدمون النشطون أسبوعيًا
اجمع بين التجميع والعدّ المميز. فعبارة «المستخدمون النشطون أسبوعيًا» تعني حساب المستخدمين المميزين لكل حاوية أسبوعية، وهو طلب فعلي في تحليلات المنتجات.
اقتطع الطابع الزمني للحدث إلى الأسبوع، ثم استخدم COUNT(DISTINCT user_id). كما أن الإشارة إلى أنك ستصل محورًا أسبوعيًا لإظهار أسابيع عدم النشاط قد تمنحك نقاطًا إضافية.
SELECT
DATE_TRUNC('week', event_ts) AS week,
COUNT(DISTINCT user_id) AS wau
FROM events
GROUP BY 1
ORDER BY 1;التجميع في عمود مفهرس
هناك ملاحظة مهمة تتعلق بالأداء ينبغي ذكرها: قد يؤدي تغليف عمود التاريخ داخل DATE_TRUNC في عبارة WHERE إلى منع المخطِّط من استخدام الفهرس الموجود على ذلك العمود.
ولا مشكلة في استخدامه داخل GROUP BY، لكن عند التصفية قارن العمود الخام بحدود محسوبة بدلًا من ذلك. وقد تناولنا هذا النمط ذي الطرف المفتوح سابقًا، وهو ينطبق هنا أيضًا.
-- Avoid in WHERE: DATE_TRUNC('month', order_ts) = '2024-03-01'
-- Prefer:
SELECT * FROM orders
WHERE order_ts >= DATE '2024-03-01'
AND order_ts < DATE '2024-04-01';اختبار سريع
اختر الأداة المناسبة لإنشاء مخطط اتجاه شهري يُبقي السنوات منفصلة.
مراجعة: اقتطاع التواريخ وتجميعها
ما ينبغي تذكّره:
- تعمل
DATE_TRUNC(unit, ts)على تحويل الطوابع الزمنية إلى بداية فترة، مع إبقاء السنوات منفصلة، ولذلك فهي الأداة المناسبة للسلاسل الزمنية. - تعيد
EXTRACTرقمًا مجردًا، وهو مناسب لتحليل الموسمية، لكنه يدمج السنوات. - تبدأ أسابيع Postgres يوم الاثنين؛ أجرِ إزاحة إذا كنت تحتاج إلى بدء الأسبوع يوم الأحد.
- تستخدم MySQL الدالة
DATE_FORMAT؛ وتستخدم إصدارات SQL Server الأقدم الأسلوب الاصطلاحيDATEADD(DATEDIFF(...))؛ أما الإصدارات 2022 وما بعدها فتحتوي علىDATETRUNC. - استخدم محور تواريخ مُنشأ + LEFT JOIN لإظهار الفترات الفارغة، وتجنّب استخدام
DATE_TRUNCداخلWHEREللحفاظ على إمكانية استخدام الفهرس.
الأسئلة الشائعة
هل درس «اقتطاع التواريخ وتجميعها في فئات» مجاني؟
نعم — نص درس «اقتطاع التواريخ وتجميعها في فئات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Coding Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة Coding Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «اقتطاع التواريخ وتجميعها في فئات»؟
التجميع حسب الأسبوع والشهر والربع باستخدام DATE_TRUNC وما يعادله تتمرن على Coding Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Coding Interview Prep؟
لا تُشترط خبرة سابقة. Coding Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «اقتطاع التواريخ وتجميعها في فئات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Coding Interview Prep هذا؟
نعم. كل درس في Coding Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الحساب باستخدام التواريخ والفواصل الزمنية
- اقتطاع التواريخ وتجميعها في فئات
- تحليل السلاسل النصية وتنسيقها
- المناطق الزمنية والطوابع الزمنية