Data ManagementSAS ProgrammingStatistical Data Analysis

كيفية استخدام دوال DAY و MONTH و YEAR في SAS

دليل منهجي شامل يشرح كيفية استخدام دوال DAY و MONTH و YEAR في SAS لاستخراج القيم الرقمية للأيام والشهور والسنوات من متغيرات التاريخ وتحليلها بدقة.

تاريخ النشر

تُعد معالجة البيانات الزمنية وإدارتها بكفاءة أحد الركائز الجوهرية في التحليل الإحصائي وعلوم البيانات الحديثة، لا سيما عند استخدام بيئات الحوسبة الإحصائية المتقدمة مثل نظام التحليل الإحصائي SAS (Statistical Analysis System). فالتاريخ ليس مجرد طابع زمني جامد يُسجل لحظة وقوع الحدث، بل هو بُعد تحليلي متعدد الطبقات يحمل في طياته أنماطاً دورية، وتغيرات موسمية، واتجاهات طويلة الأجل تؤثر تأثيراً مباشراً على دقة الاستدلال الإحصائي وبناء النماذج التنبؤية. ومن هذا المنطلق، تبرز الحاجة الملحة إلى أدوات برمجية دقيقة تمكن الباحث والمحلل من تفكيك هذا المتغير المركب إلى عناصره الأولية المستقلة المتمثلة في اليوم والشهر والسنة دون الإخلال بالسلامة الهيكلية للبيانات.

يقدم برنامج SAS منظومة متكاملة ودقيقة للتعامل مع التواريخ والأوقات، تستند إلى تمثيل رياضي فريد يضمن أعلى مستويات الكفاءة الحاسوبية والسرعة في المعالجة الجبرية والمنطقية. وتأتي دوال التاريخ الأساسية الثلاث: DAY و MONTH و YEAR في طليعة هذه المنظومة؛ إذ توفر الوسيلة المعيارية لاستخلاص المكونات العددية للتاريخ بدقة متناهية، مما يمهد الطريق لإعادة تصنيف المشاهدات، وهندسة الخصائص للمتغيرات (Feature Engineering)، وبناء المقارنات الزمنية المعقدة سواء داخل خطوة البيانات (DATA Step) أو عبر الاستعلامات المتقدمة في إجراءات SQL والإجراءات الإحصائية المتخصصة.

يهدف هذا الدليل الشامل والمفصل إلى تقديم دراسة معمقة وتطبيقية لكيفية استخدام وتوظيف دوال DAY و MONTH و YEAR في بيئة SAS. سنتناول بالتفصيل البنية التحتية لتخزين التواريخ في الذاكرة، والمفاهيم الرياضية المرتبطة بنقطة المرجع الصفرية، وآليات التحويل بين السلاسل النصية والأرقام الزمنية، إلى جانب استعراض الصيغ التركيبية لكل دالة وتطبيقاتها في التحليل الموسمي والتتبعي، وإدارة القيم المفقودة، وصولاً إلى تحسين الأداء وتجنب الأخطاء البرمجية الشائعة في المشاريع الإحصائية الضخمة.

1. مقدمة إلى التعامل مع التواريخ في برنامج SAS وأهميتها في التحليل الإحصائي

1.1 أهمية التفكيك الزمني لبيانات التواريخ في الدراسات الإحصائية

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

يلعب تفكيك التاريخ دوراً محورياً في دراسة الاتجاهات الموسمية (Seasonal Trends) والتغيرات الدورية التي تميز العديد من الظواهر الاقتصادية والطبية والاجتماعية. فعلى سبيل المثال، في الدراسات الوبائية، يساعد عزل متغير “الشهر” على رصد موجات انتشار الأمراض المعدية التي تنشط في فصول محددة، بينما يتيح عزل متغير “اليوم” مراقبة تأثير أيام الأسبوع أو بدايات ونهايات الأشهر على معدلات التردد على المستشفيات. هذا الفصل الدقيق يمنع التداخل بين التغيرات قصيرة المدى (اليومية) والتغيرات متوسطة المدى (الشهرية) والاتجاهات الهيكلية العامة (السنوية).

يسهم هذا التفكيك أيضاً في تحسين جودة ونماذج التنبؤ الإحصائي عبر عزل تأثير كل بعد زمني بصورة مستقلة، مما يدعم عمليات هندسة الخصائص في خوارزميات التعلم الآلي والنمذجة القياسية القياسية مثل نماذج السلاسل الزمنية (ARIMA) ونماذج الانحدار الخطي واللوجستي. بالإضافة إلى ذلك، يسهل التفكيك الزمني تصنيف وتجميع المجموعات البحثية (Cohorts) وفق فترات زمنية دقيقة، مثل مقارنة أداء مجموعات علاجية بدأت في سنوات مختلفة أو تقييم سلوك المستهلكين بناءً على أيام الشراء، مما يرفع من القوة الإحصائية للاختبارات ويزيد من مصداقية النتائج المستخلصة.

1.2 نظرة عامة على دوال التاريخ الأساسية الثلاث: DAY و MONTH و YEAR

صمم نظام SAS ثلاث دوال برمجية محورية تشكل حجر الزاوية في التعامل مع التواريخ اليومية: الدالة DAY، والدالة MONTH، والدالة YEAR. تتميز هذه الدوال ببساطة تركيبها البرمجي وقوتها الحسابية في آن واحد؛ إذ تعمل جميعها وفق منطق تحويلي موحد يستقبل قيمة تاريخ صالحة كمدخل، ويقوم بإجراء العمليات الحسابية اللازمة داخلياً لاستخلاص الجزء المحدد وإرجاعه في صورة قيمة عددية صحيحة (Integer) خالية من أي تنسيقات مسبقة، مما يجعل المخرجات مهيأة مباشرة للعمليات الحسابية والمنطقية اللاحقة.

تتطلب هذه الدوال الثلاث كمدخل أساسي متغيراً يحمل “قيمة تاريخ SAS” (SAS Date Value) صالحة، وهي قيمة رقمية تمثل التاريخ داخلياً في النظام. لا تقبل هذه الدوال النصوص العادية أو التواريخ المكتوبة بصيغ نصية مجردة ما لم يتم تحويلها مسبقاً أو تضمينها كقيم تاريخ ثابتة (Date Literals). فعند تمرير التاريخ لدالة DAY، فإنها تحسب اليوم المقابل في الشهر الميلادي وتُرجع رقماً يتراوح حصراً بين 1 و 31، في حين تُرجع دالة MONTH رقماً يمثل ترتيب الشهر بين 1 و 12، بينما تستخلص دالة YEAR السنة الميلادية كاملة في صورة عدد صحيح مكون من أربعة أرقام.

تكمن القيمة التطبيقية لهذه المخرجات الرقمية في سهولة دمجها في الجمل الشرطية وعمليات التجميع الرياضي والإحصائي. فبدلاً من التعامل مع سلاسل نصية معقدة تتطلب مطابقة أنماط الحروف والأرقام، تصبح الأبعاد الزمنية أرقاماً قياسية يمكن استخدامها في المقارنات الرياضية (مثل أكبر من أو أصغر من)، أو كعوامل تصنيف في الإجراءات الإحصائية مثل PROC FREQ و PROC MEANS، مما يضمن كفاءة المعالجة وسرعة التنفيذ حتى مع قواعد البيانات العملاقة التي تضم ملايين السجلات.

1.3 متطلبات إعداد بيئة العمل وهيكل البيانات المناسب في SAS

لضمان التنفيذ السليم لدوال التاريخ وتفادي الأخطاء البرمجية أو النتائج غير المتوقعة، يجب إعداد بيئة العمل وهيكل البيانات في SAS بعناية فائقة. الشرط الأساسي الأول هو التأكد من تعريف متغير التاريخ كمتغير رقمي يحمل قيمة زمنية صالحة وليس كمتغير نصي (Character Variable). إذا كانت البيانات الأصلية مستوردة من مصادر خارجية مثل ملفات CSV أو قواعد بيانات علائقية بصيغة نصية، فيجب استخدام تنسيقات الإدخال (Informats) المناسبة لتحويل تلك النصوص إلى قيم تواريخ نظامية قبل استدعاء دوال DAY و MONTH و YEAR.

يتطلب إدخال البيانات استخدام تنسيقات إدخال متطابقة تماماً مع بنية التاريخ في الملف المصدر. على سبيل المثال، إذا كان التاريخ مكتوباً بالصيغة “15MAY2023″، يجب استخدام تنسيق الإدخال DATE9.، وإذا كان بصيغة “05/15/2023″، يجب تطبيق تنسيق الإدخال MMDDYY10.. يؤدي استخدام تنسيق إدخال خاطئ إلى قراءة مشوهة للتاريخ أو توليد قيم مفقودة (Missing Values)، مما ينعكس سلباً على نتائج الدوال المشتقة منها.

من الضروري أيضاً مراجعة إعدادات النظام الإقليمية والمتغيرات العامة في SAS، وتحديداً خيار YEARCUTOFF. يتحكم هذا الخيار في كيفية تفسير السنوات المكتوبة برقمين فقط (Two-Digit Years)، حيث يحدد بداية النطاق الزمني الممتد لمائة عام لتفسير القرن الصحيح. إن ضبط هذه الإعدادات مسبقاً يضمن اتساق قراءة التواريخ التاريخية والمعاصرة ويمنع حدوث أخطاء فادحة عند استخراج السنوات عبر دالة YEAR.

DAY, MONTH, YEAR functions in SAS
DAY, MONTH, YEAR functions in SAS

2. البنية الأساسية لتخزين التواريخ في نظام SAS (SAS Date Values)

2.1 المفهوم الرياضي لقيم التواريخ في SAS ونقطة المرجع الصفرية

يعتمد نظام SAS نموذجاً رياضياً دقيقاً وبسيطاً لتخزين التواريخ في الذاكرة الفيزيائية للحاسوب؛ حيث لا يقوم بتخزين اليوم والشهر والسنة كسلاسل نصية أو كبنى برمجية معقدة، بل يحول التاريخ بأكمله إلى عدد صحيح نسبي يمثل عدد الأيام المنقضية منذ نقطة مرجعية محددة تُعرف بنقطة الصفر الزمني (Epoch). هذه النقطة المرجعية الثابتة في معمارية SAS هي يوم 1 يناير 1960، والتي تأخذ القيمة الرقمية صفر (0).

بناءً على هذه المنظومة الحسابية، تُعامل جميع التواريخ اللاحقة ليوم 1 يناير 1960 كأعداد صحيحة موجبة؛ فعلى سبيل المثال، يُمثل يوم 2 يناير 1960 بالرقم 1، ويُمثل يوم 1 يناير 2020 بالرقم 21915 (أي أنه يبعد 21915 يوماً عن نقطة الصفر). وفي المقابل، تُعامل جميع التواريخ السابقة ليوم 1 يناير 1960 كأعداد صحيحة سالبة؛ فيأخذ يوم 31 ديسمبر 1959 القيمة الرقمية -1، ويأخذ يوم 1 يناير 1900 القيمة الرقمية -21915. يوضح الجدول التالي نماذج لقيم التخزين الرياضية للتواريخ في SAS:

توضح هذه البنية الرقمية كيف يحول نظام SAS المفاهيم الزمنية إلى خط أعداد مستمر، مما يجعل العمليات الجبرية فائقة السرعة والدقة الرياضية.

التاريخ الميلادي الفعلي القيمة الرقمية المخزنة في SAS تنسيق العرض الافتراضي (DATE9.) ملاحظات حسابية
1 يناير 1900 -21915 01JAN1900 تاريخ تاريخي (قيمة سالبة)
31 ديسمبر 1959 -1 31DEC1959 اليوم السابق لنقطة الصفر
1 يناير 1960 0 01JAN1960 نقطة المرجع الصفرية المعتمدة
2 يناير 1960 1 02JAN1960 اليوم التالي لنقطة الصفر
1 يناير 2000 14610 01JAN2000 تاريخ بداية الألفية الثالثة
15 مايو 2023 23145 15MAY2023 قيمة رقمية موجبة حديثة

يوفر هذا التمثيل العددي ميزة استثنائية في إجراء المقارنات والعمليات الجبرية؛ إذ يمكن حساب الفرق بالأيام بين أي تاريخين بعملية طرح حسابية مباشرة وبسيطة دون الحاجة إلى خوارزميات معقدة لمعالجة عدد أيام الشهور أو السنوات الكبيسة. كما أن الدوال الثلاث DAY و MONTH و YEAR تأخذ هذا الرقم الصحيح وتجري عليه حسابات التقويم الغريغوري داخلياً لإعادة توليد الأجزاء الزمنية بدقة متناهية.

2.2 الفرق الجوهري بين قيمة التاريخ المخزنة والتنسيق الظاهري (Format)

من أهم المفاهيم التي يجب على مبرمج SAS استيعابها هو الفصل التام بين “القيمة المخزنة” (Stored Value) و”التنسيق الظاهري” (Format). القيمة المخزنة هي الرقم الفعلي الذي يتعامل معه المعالج ويبقى ثابتاً في الذاكرة بغض النظر عن طريقة عرضه، بينما التنسيق هو مجرد قناع بصري (Visual Mask) يحدد كيفية طباعة هذا الرقم للمستخدم البشري في التقارير وجداول المخرجات.

عندما نطبق تنسيقاً مثل DATE9. أو YYMMDD10. أو WORDDATE. على متغير تاريخ يحمل القيمة الرقمية 23145، فإن القيمة المخزنة لا تتغير مطلقاً بل تظل 23145، ولكن شاشة المخرجات تعرض “15MAY2023” أو “2023-05-15” أو “May 15, 2023” على التوالي. هذا الفصل يفسر لماذا تفشل العمليات النصية العادية إذا طُبقت مباشرة على التواريخ؛ فالمتغير يظل رقمياً في جوهره الداخلي.

يؤدي الفهم الخاطئ للعلاقة بين التنسيق والقيمة إلى أخطاء شائعة عند استدعاء الدوال الحسابية. فالدوال DAY و MONTH و YEAR لا تقرأ التنسيق الظاهري إطلاقاً، بل تتعامل مباشرة وبشكل حصري مع القيمة الرقمية المخزنة في الخلفية. وبالتالي، فإن تغيير تنسيق عرض التاريخ في خطوة سابقة لن يؤثر بأي شكل من الأشكال على نتيجة الدالة، ما دام الرقم الصحيح الأساسي يمثل التاريخ الصحيح.

2.3 تحويل السلاسل النصية إلى قيم تواريخ صالحة للاستخدام مع الدوال

في كثير من التطبيقات العملية، تأتي التواريخ مخزنة في ملفات البيانات الخارجية كمتغيرات نصية مثل “2023/05/15” أو “15-05-2023”. إذا تم تمرير متغير نصي مباشرة إلى دوال DAY أو MONTH أو YEAR، فسيقوم محرك SAS بمحاولة إجراء تحويل ضمني (Implicit Conversion) قد يفشل أو ينتج عنه قيم خاطئة ومفقودة، مع تسجيل تحذيرات في سجل النظام (SAS Log). لذلك، يجب تحويل النصوص إلى قيم تواريخ صالحة باستخدام الدالة INPUT قبل معالجتها.

تأخذ الدالة INPUT المعامل النصي وتنسيق الإدخال المناسب له، وتحوله إلى القيمة الرقمية المعيارية المقابلة في SAS. على سبيل المثال، لتحويل سلسلة نصية تحتوي على تاريخ بصيغة يوم-شهر-سنة، نستخدم التركيب البرمجي التالي:

sas_date = INPUT(char_date_var, ANYDTDTE10.);

يتميز تنسيق الإدخال ANYDTDTE. بقدرته العالية على التعرف التلقائي على هياكل التواريخ المتنوعة، مما يساعد في تجاوز مشكلات تباين الصيغ داخل نفس السجل أو عبر ملفات متعددة.

بعد إتمام عملية التحويل بنجاح والتأكد من خلو الناتج من القيم المفقودة غير المقصودة، يمكن تمرير المتغير الرقمي الجديد (sas_date) بأمان كامل إلى دوال التفكيك الزمني DAY(sas_date) و MONTH(sas_date) و YEAR(sas_date). هذا التسلسل البرمجي المنضبط يضمن أعلى درجات الموثوقية ويمنع حدوث أخطاء التشغيل في خطوط إنتاج البيانات المعقدة.

3. الدالة DAY: المفهوم النظري وآلية استخراج رقم اليوم

3.1 الصيغة التركيبية (Syntax) لدالة DAY في SAS

تتميز الدالة DAY في لغة SAS بصيغة تركيبية موجزة وواضحة للغاية، حيث تُعرف برمجياً بالشكل التالي:

day_number = DAY(date_value);

تستقبل الدالة معاملاً واحداً فقط (date_value)، والذي يجب أن يكون متغيراً رقمياً يمثل تاريخ SAS صالحاً، أو ثابتاً زمنياً معتمداً (Date Literal)، أو تعبيراً حسابياً ناتجه يمثل تاريخاً صحيحاً. لا تقبل الدالة أي معاملات إضافية، مما يجعل استدعاءها سريعاً ومباشراً داخل أي تعبير رياضي في خطوة DATA Step أو استعلامات SQL.

تتراوح القيم المخرجة المحتملة الناتجة عن تنفيذ الدالة DAY حصراً بين الأعداد الصحيحة 1 و 31، معبرة بدقة عن الترتيب التسلسلي لليوم داخل الشهر التقويمي المحدد. تستجيب الدالة بمرونة تامة للاختلافات الطبيعية في أطوال الأشهر الميلادية؛ فهي ترجع قيماً تصل إلى 30 للأشهر المكونة من ثلاثين يوماً (مثل أبريل ويونيو)، وتصل إلى 31 للأشهر الطويلة (مثل يناير ومارس)، كما تتعامل بدقة متناهية مع شهر فبراير سواء كان في سنة بسيطة (فترجع قيماً حتى 28) أو في سنة كبيسة (فترجع قيماً حتى 29).

3.2 تطبيقات دالة DAY في التحليلات الإحصائية وتجزئة البيانات

توفر الدالة DAY أداة تحليلية قوية لاستكشاف الأنماط السلوكية التي تحدث على مقياس الأيام داخل الأشهر. ففي التحليلات المالية وتحليلات الأعمال، تُستخدم المخرجات الرقمية لرقم اليوم لتتبع سلوكيات السداد، ودراسة نمط المبيعات في بدايات الأشهر مقارنة بنهاياتها، وهو ما يعرف بـ “تأثير دورة الراتب” (Payday Effect). كما تفيد في رصد وتيرة التسجيل في المنصات الإلكترونية أو معدلات الجريمة والحوادث المرتبطة بأيام محددة من الشهر.

تُعد الدالة DAY الأساس البرمجي لإنشاء متغيرات وسيطة تهدف إلى تجزئة الشهر إلى فترات زمنية متساوية، مثل تقسيم الشهر إلى ثلاث عشريات (Decades): العشرية الأولى (الأيام من 1 إلى 10)، والعشرية الثانية (الأيام من 11 إلى 20)، والعشرية الثالثة (من 21 حتى نهاية الشهر). يتيح هذا التصنيف تقليل التشويش اليومي في البيانات وتسهيل النمذجة الإحصائية لتوزيع النشاط عبر أثلاث الشهر المختلفة.

إلى جانب ذلك، تُستخدم القيمة المستخرجة لدعم خوارزميات التدقيق الداخلي (Internal Auditing) ومطابقة السجلات عبر أنظمة متعددة. فمن خلال فحص التوزيع التكراري لرقم اليوم، يمكن لمحققي البيانات اكتشاف حالات التزوير أو الأخطاء النظامية، مثل تركز غير طبيعي للبيانات في اليوم الأول أو الأخير من الشهر نتيجة إدخالات تلقائية افتراضية من الأنظمة القديمة.

3.3 أمثلة برمجية متخصصة لاستخراج اليوم من التواريخ المركبة

لتوضيح كيفية استدعاء الدالة DAY عملياً، نستعرض هذا النموذج البرمجي المتكامل ضمن خطوة DATA Step، والذي يوضح استخراج اليوم من متغير تاريخ في جدول بيانات، ومن ثابت تاريخ مباشر:

DATA work.extract_day_example;
    /* تعريف تاريخ مباشر كثابت زمني */
    sample_date = '29FEB2024'd; /* سنة كبيسة */
    extracted_day = DAY(sample_date);
    OUTPUT;

    sample_date = '15AUG2023'd;
    extracted_day = DAY(sample_date);
    OUTPUT;
RUN;

عند تنفيذ هذا الكود، سيحتوي جدول البيانات الناتج work.extract_day_example على عمودين: المتغير sample_date والمتغير الرقمي الجديد extracted_day. في السجل الأول، ستكون القيمة المستخرجة هي الرقم الصحيح 29، مما يوضح قدرة الدالة على التعامل السليم مع اليوم الإضافي في السنوات الكبيسة، بينما في السجل الثاني ستكون القيمة المستخرجة هي الرقم 15.

يؤكد فحص جدول المخرجات بواسطة إجراءات SAS أن المتغير extracted_day هو متغير رقمي أصيل (Numeric) خالي من التنسيقات، مما يجعله جاهزاً للدخول في العمليات الرياضية مثل حسابه كمتوسط حسابي أو استخدامه كمعيار فرز وتصنيف دون أي خطوات معالجة إضافية.

4. الدالة MONTH: المفهوم النظري وتحديد الشهر كقيمة رقمية

4.1 الصيغة التركيبية والخصائص التقنية لدالة MONTH

تُعد الدالة MONTH الأداة الأساسية لاستخلاص الترتيب الشهري في بيئة SAS. وتأتي صيغتها التركيبية المباشرة على النحو التالي:

month_number = MONTH(date_value);

وكما هو الحال في دالة اليوم، تستقبل دالة MONTH مدخلاً وحيداً يمثل تاريخ SAS صالحاً، وتقوم بإجراء التحويل الحسابي التقويمي لإرجاع رقم الشهر دون أي تعقيدات تركيبية إضافية.

تتمثل المخرجات الناتجة عن هذه الدالة في أرقام صحيحة تقع حصراً في النطاق المغلق من 1 إلى 12. يتطابق هذا المخرج العددي تماماً مع الترتيب المعياري لشهور السنة في التقويم الميلادي الغريغوري؛ حيث يمثل الرقم 1 شهر يناير (January)، ويمثل الرقم 2 شهر فبراير (February)، وصولاً إلى الرقم 12 الذي يمثل شهر ديسمبر (December).

تتميز الدالة بحصانتها البرمجية؛ فهي لا تتأثر بأسماء الأشهر النصية أو لغة الواجهة المستخدمة في نظام التشغيل، بل تعتمد حصرياً على المنطق الرياضي لتحديد رقم الشهر، مما يجعل الأكواد المكتوبة باستخدام MONTH قابلة للنقل والتشغيل عبر خوادم وبيئات SAS العالمية دون أي اختلاف في النتائج.

4.2 التحليل الموسمي والدوري باستخدام مخرجات دالة MONTH

يُعد التحليل الموسمي (Seasonal Analysis) أحد أهم تطبيقات الدالة MONTH في مجالات الإحصاء التطبيقي وعلم الأوبئة والعلوم البيئية والاقتصاد القياسي. يتيح استخراج رقم الشهر تجميع الملاحظات عبر سنوات متعددة وفقاً للشهر ذاته، مما يسمح بحساب المؤشرات الإحصائية المجمعة لكل شهر ومقارنتها عبر الزمن للكشف عن الأنماط الدورية المنتظمة التي تتكرر سنوياً بصرف النظر عن الاتجاه العام طويل الأجل.

علاوة على ذلك، يمثل رقم الشهر المستخرج اللبنة الأساسية لبناء متغيرات الفصول المناخية أو الربع سنوية (Quarterly Variables). فباستخدام شروط برمجية بسيطة، يمكن تجميع الشهور في أربعة فصول رئيسية على النحو التالي:

  • فصل الشتاء: الشهور 12، 1، 2.
  • فصل الربيع: الشهور 3، 4، 5.
  • فصل الصيف: الشهور 6، 7، 8.
  • فصل الخريف: الشهور 9، 10، 11.

يسهل هذا التقسيم النمذجة الإحصائية لتأثير العوامل المناخية والموسمية على مبيعات السلع، واستهلاك الطاقة الكهربائية، ومعدلات الإصابة بأمراض الجهاز التنفسي، مما يعزز من كفاءة التحليل التنبؤي.

4.3 حالات تطبيقية متقدمة لاستخدام دالة MONTH

في التطبيقات المتقدمة، تُدمج مخرجات الدالة MONTH مع دوال ومصفوفات لغوية متخصصة لإنشاء تقارير نصية مخصصة أو متغيرات تصنيفية متقدمة. يوضح الكود التالي كيفية استخراج رقم الشهر، واستخدامه لتصنيف الحالات إلى فصول سنوية، وتوليد اسم الشهر النصي بالاعتماد على دالة التنسيق:

DATA work.seasonal_classification;
    SET work.patient_admissions;
    month_num = MONTH(admission_date);
    
    /* التصنيف إلى فصول مناخية */
    IF month_num IN (12, 1, 2) THEN season = 'Winter';
    ELSE IF month_num IN (3, 4, 5) THEN season = 'Spring';
    ELSE IF month_num IN (6, 7, 8) THEN season = 'Summer';
    ELSE IF month_num IN (9, 10, 11) THEN season = 'Autumn';
    
    /* استخراج اسم الشهر كنص مقروء */
    month_name = PUT(admission_date, MONNAME.);
RUN;

يتيح هذا البناء البرمجي المتكامل للباحث إجراء اختبارات إحصائية متقدمة مثل تحليل التباين (ANOVA) أو اختبار مربع كاي (Chi-Square) لاختبار فرضيات تجانس توزيع الحالات المرضية عبر شهور السنة وفصولها، مما يوفر رؤى دقيقة تدعم صناع القرار في توزيع الموارد الطبية والبشرية بكفاءة.

5. الدالة YEAR: المفهوم النظري واستخراج السنة من المتغير الزمني

5.1 الصيغة البرمجية لدالة YEAR ودقة التعامل مع القرون

تختص الدالة YEAR باستخلاص البُعد الزمني الكلي المتمثل في السنة التقويمية من متغير التاريخ. وتأتي صيغتها البرمجية القياسية على الصورة التالية:

year_number = YEAR(date_value);

تأخذ الدالة قيمة تاريخ SAS الرقمية وتُرجع السنة الميلادية كقيمة عددية صحيحة مكونة من أربعة أرقام كاملة (Four-Digit Year) مثل 1995 أو 2024. هذه الميزة الجوهرية تضمن التخلص التام والنهائي من مشكلات غموض القرون وتفادي الالتباس المرتبط بالسنوات الممثلة برقمين فقط.

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

5.2 التحليل الزمني الطويل الأجل (Longitudinal Analysis) باستخدام دالة YEAR

يُعد التحليل الزمني الطويل الأجل ومتابعة التطور التاريخي للمتغيرات عبر العقود أحد أهم مجالات تطبيق الدالة YEAR. فمن خلال استخراج السنة من تواريخ الأحداث، يستطيع المحللون تجميع البيانات سنوياً لدراسة مسارات النمو الاقتصادي، ومعدلات الخصوبة والوفيات، والتغيرات الهيكلية في الأسواق المالية على مدى فترات زمنية طويلة الأمد دون التشويش الناتج عن التقلبات الشهرية أو اليومية.

تلعب دالة YEAR دوراً حاسماً في حساب الفئات العمرية (Age Cohorts) ومؤشرات البقاء؛ حيث يمكن بعمليات طرح بسيطة بين سنة المسح وسنة الميلاد حساب العمر بالسنوات بصورة تقريبية سريعة تفيد في التصنيف الديموغرافي الأولي للمشاهدات. كما تسمح بتجميع الأفراد في مجموعات سنوية متجانسة لمتابعة سلوك جيل معين عبر الزمن، وهو ما يمثل ركناً أساسياً في الأبحاث الاجتماعية والطبية التتبعية.

تُمكّن الدالة أيضاً من إنشاء متغيرات التحكم الزمني (Time Fixed Effects) في نماذج الانحدار للبيانات اللوحية (Panel Data Models)، حيث تُدرج السنوات كمتغيرات وهمية (Dummy Variables) للتحكم في الصدمات الاقتصادية والسياسية العامة التي تؤثر على جميع المشاهدات في سنة معينة، مما يرفع من جودة التقدير الإحصائي للمعاملات.

5.3 نماذج برمجية لاستخراج السنة والتحقق من صحتها

يوضح المثال البرمجي التالي كيفية تطبيق دالة YEAR على مجموعة بيانات تحتوي على تواريخ ولادة وتواريخ تشخيص طبي، واستخدام القيم المستخرجة في حساب العمر عند التشخيص وتوليد معرّف فريد للسجل:

DATA work.cohort_analysis;
    INPUT patient_id birth_date :DATE9. diagnosis_date :DATE9.;
    FORMAT birth_date diagnosis_date DATE9.;
    
    /* استخراج السنوات */
    birth_year = YEAR(birth_date);
    diagnosis_year = YEAR(diagnosis_date);
    
    /* حساب العمر التقريبي وسنة الانضمام للدراسة */
    approx_age_at_diag = diagnosis_year - birth_year;
    
    /* توليد معرّف يدمج السنة مع المعرّف الفردي */
    record_uid = CATX('-', PUT(diagnosis_year, 4.), PUT(patient_id, Z5.));

DATALINES;
101 12MAR1955 15OCT2020
102 28NOV1982 04JAN2022
103 05JUL1999 19AUG2023
;
RUN;

يوضح هذا الكود كيف تعمل دالة YEAR على استخلاص الأرقام الصحيحة للسنوات بدقة متناهية وبشكل فوري، مما يسمح بحساب الفارق الزمني وتوليد المعرف المركب record_uid الذي يبدأ بسنة التشخيص (مثل “2020-00101”)، وهو ما يضمن تنظيماً هيكلياً مثالياً لقواعد البيانات البحثية.

6. التطبيق العملي الأساسي: استخراج اليوم والشهر والسنة معاً في خطوة DATA Step

6.1 بناء مجموعة بيانات اختبارية متكاملة (Dataset Creation)

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

DATA work.transactions;
    INPUT trans_id $ trans_date :DATE9. amount;
    FORMAT trans_date DATE9. amount DOLLAR10.2;
DATALINES;
TXN001 01JAN1960 1500.50
TXN002 29FEB2020 3200.00
TXN003 15JUL2021 450.75
TXN004 31DEC2022 8900.20
TXN005 18SEP2023 2100.00
;
RUN;

يمكننا فحص سلامة البيانات المدخلة وتأكيد ظهور التواريخ والمبالغ بالتنسيقات المحددة عبر استدعاء الإجراء PROC PRINT على النحو التالي:

PROC PRINT DATA=work.transactions NOOBS;
    TITLE "جدول المعاملات المالية الأولي قبل التفكيك الزمني";
RUN;

يظهر الجدول المطبوع البيانات بصورة واضحة، حيث يحمل المتغير trans_date قيماً منسقة ظاهرياً بصيغة DATE9.، ولكنه في الذاكرة الداخلية لـ SAS يحمل الأرقام الصحيحة للأيام المقابلة لتلك التواريخ.

6.2 تنفيذ كود المعالجة المتزامنة لاستخراج العناصر الثلاثة

بعد تجهيز البيانات المصدرية، نقوم بكتابة خطوة DATA Step لمعالجة المشاهدات واستخراج اليوم والشهر والسنة بشكل متزامن في دورة قراءة واحدة، وحفظ النتائج في جدول مخرجات جديد باسم work.transactions_decomposed:

DATA work.transactions_decomposed;
    SET work.transactions;
    
    /* استخراج الأبعاد الزمنية الثلاثة بدقة */
    trans_day = DAY(trans_date);
    trans_month = MONTH(trans_date);
    trans_year = YEAR(trans_date);
    
    /* إضافة توصيف وصفي للأعمدة الجديدة */
    LABEL trans_day = "يوم المعاملة (1-31)"
          trans_month = "شهر المعاملة (1-12)"
          trans_year = "سنة المعاملة (YYYY)";
RUN;

يوضح هذا الكود بساطة وقوة المعالجة؛ حيث تتولى جملة SET جلب السجلات سجلاً تلو الآخر إلى منطقة عمل الذاكرة (Program Data Vector – PDV)، وتنفذ جمل التعيين البرمجية الدوال الثلاث في أجزاء من المليون من الثانية، لتقوم بإضافة ثلاثة أعمدة رقمية جديدة ومستقلة بالكامل إلى بنية البيانات الناتجة.

6.3 فحص النتائج وتقييم صحة المتغيرات الرقمية المستخرجة

للتحقق العلمي الدقيق من نجاح العملية وسلامة البنية الهيكلية للمتغيرات، نستخدم الإجراءين PROC CONTENTS و PROC PRINT:

PROC CONTENTS DATA=work.transactions_decomposed;
RUN;

PROC PRINT DATA=work.transactions_decomposed LABEL NOOBS;
    TITLE "جدول المعاملات بعد استخراج اليوم والشهر والسنة بنجاح";
RUN;

يؤكد تقرير PROC CONTENTS أن المتغيرات الثلاثة المستخرجة تحمل جميعها النوع Numeric وبطول تخزين افتراضي يبلغ 8 بايت، وهي خالية من أي تنسيقات قد تشوش استخدامها لاحقاً. في حين يعرض تقرير PROC PRINT تطابقاً تاماً بين التواريخ الأصلية والقيم المستخرجة؛ فالمعاملة TXN002 في “29FEB2020” تُظهر بدقة: اليوم=29، الشهر=2، السنة=2020، مما يثبت نجاح الكود وموثوقيته العلمية لإعادة الإنتاج.

7. التطبيق العملي المتقدم: دمج واستخراج الشهر والسنة معاً لأغراض التحليل التجميعي

7.1 الحاجة إلى متغيرات مجمعة تمثل الشهر والسنة فقط

في العديد من الدراسات التحليلية الموسعة وتقارير الأداء الدوري، يكون مستوى التفصيل اليومي غير ضروري ويؤدي إلى زيادة غير مرغوبة في التباين العشوائي للبيانات (Daily Noise). فالتقارير المالية الدورية، والمسوحات الاقتصادية الكلية، وتحليلات المؤشرات الصحية العامة تركز في المقام الأول على التغيرات التي تحدث من شهر إلى آخر أو من سنة إلى أخرى.

يوفر التلخيص على مستوى “الشهر والسنة” وحدة زمنية مثالية لتحليلات السلاسل الزمنية الشهرية، ودراسة معدلات النمو السنوي المركب (CAGR)، وإجراء المقارنات بين الفترات المتماثلة (Year-over-Year Comparisons). يقلل هذا المستوى التجميعي من حجم مجموعات البيانات الضخمة، ويسرع من زمن معالجة النماذج الإحصائية دون فقدان الرؤية الجوهرية للاتجاهات الدورية.

7.2 طرق استخراج وعرض الشهر والسنة معاً في SAS

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

  • طريقة محاذاة التاريخ (INTNX Function): وهي الطريقة الرياضية الأكثر كفاءة وملاءمة للتحليل الإحصائي؛ حيث تُستخدم دالة INTNX('MONTH', date_var, 0, 'BEGINNING') لنقل كافة تواريخ الشهر إلى أول يوم فيه، مع تطبيق تنسيق العرض MONYY7. أو YYMMN6.. تحتفظ هذه الطريقة بالخاصية الزمنية الرقمية للمتغير.
  • طريقة التوليد النصي (PUT Function): تستخدم الدالة PUT(date_var, MONYY7.) لتوليد متغير نصي مباشر يحمل القيمة مثل “JUL2021”. هذه الطريقة ممتازة للعرض والطباعة لكنها تفقد المتغير خواصه الرياضية.
  • طريقة الحساب الرقمي المركب: دمج السنة والشهر حسابياً في رقم واحد مثل Year_Month = YEAR(date)*100 + MONTH(date); لينتج رقماً مثل 202107، وهو مفيد للفرز السريع والربط بين الجداول.

7.3 كتابة أكواد عملية لتوليد متغير الشهر والسنة ومراجعة المخرجات

يوضح البرنامج التطبيقي التالي تطبيق الطرق المذكورة لإنشاء متغيرات الشهر والسنة، واستخدام المتغير المجمع في حساب جدول التكرارات الإحصائية عبر إجراء PROC FREQ:

DATA work.monthly_aggregated;
    SET work.transactions;
    
    /* 1. متغير تاريخ محاذى لبداية الشهر */
    date_month_year = INTNX('MONTH', trans_date, 0, 'B');
    FORMAT date_month_year MONYY7.;
    
    /* 2. متغير رقمي مركب (YYYYMM) */
    numeric_ym = (YEAR(trans_date) * 100) + MONTH(trans_date);
    
    /* 3. متغير نصي للعرض */
    char_ym = PUT(trans_date, MONYY7.);
RUN;

/* حساب التكرارات وحجم التداول لكل شهر وسنة */
PROC FREQ DATA=work.monthly_aggregated;
    TABLES date_month_year numeric_ym / NOCUM;
    TITLE "التوزيع التكراري للمعاملات حسب الشهر والسنة";
RUN;

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

8. معالجة القيم المفقودة (Missing Values) والبيانات غير الصالحة عند استخدام دوال التاريخ

8.1 سلوك دوال DAY و MONTH و YEAR مع القيم المفقودة

تتعامل دوال DAY و MONTH و YEAR مع القيم المفقودة (Missing Values) وفق معايير برمجية صارمة ومصممة بدقة لضمان استقرار البرامج وتفادي توقف المعالجة الفجائي. عندما يُمرر للدالة متغير يحمل قيمة مفقودة قياسية (تُمثل بالنقطة . في المتغيرات الرقمية في SAS)، فإن الدالة تعيد فوراً قيمة مفقودة قياسية (.) كناتج لعملية التقييم دون إيقاف تنفيذ خطوة DATA Step.

هذا السلوك يمنع انهيار العمليات الدفيعة (Batch Jobs) عند معالجة قواعد البيانات الضخمة التي تحتوي حتماً على سجلات ناقصة. ولكن من الناحية الإحصائية، يجب على الباحث توثيق عدد السجلات المفقودة بدقة؛ لأن إغفال تتبعها قد يؤدي إلى تحيز العينات المستهدفة بالتحليل أو التأثير على أحجام العينات الفعلية الداخلة في الاختبارات الاستدلالية.

8.2 التعامل مع التواريخ غير الصالحة (Invalid Dates) وأخطاء الإدخال

تحدث أخطاء البيانات غير الصالحة (Invalid Data) عندما يحتوي ملف الإدخال على قيم يستحيل تمثيلها كتواريخ منطقية، مثل يوم 31 في شهر فبراير (مثلاً “31FEB2023”)، أو شهور خارج النطاق الطبيعي (مثل الشهر 13). عند محاولة قراءة هذه القيم باستخدام تنسيقات الإدخال مثل DATE9.، يحدد محرك SAS أن القيمة غير صالحة، ويقوم تلقائياً بتعيين قيمة مفقودة للمتغير، مع طباعة رسالة ملاحظة وتحذير (Note/Warning) مفصلة في سجل النظام (SAS Log) توضح رقم السطر والسجل المتأثر.

للتحقق البرمجي المسبق من صحة الأرقام قبل استخدامها في بناء التواريخ عبر دوال مثل MDY(month, day, year)، ينبغي تطبيق آليات تنظيف البيانات للتحقق من أن الشهور تقع بين 1 و 12، والسنوات ضمن النطاق المقبول للدراسة، والأيام لا تتجاوز الحد الأقصى للشهر المعني، مما يمنع توليد تواريخ مشوهة في قواعد البيانات.

8.3 استراتيجيات برمجية متقدمة لإدارة القيم المفقودة شرطياً

تتطلب الإدارة المنهجية للبيانات المفقودة استخدام أدوات شرطية متقدمة في SAS للتعامل مع السجلات الناقصة وفق بروتوكول التحليل المعتمد. تُعد الدالة MISSING() الأداة المثالية لاختبار وجود قيم مفقودة وتوجيه مسار المعالجة بناءً على ذلك، كما يتضح في الكود التالي:

DATA work.cleaned_dates work.missing_log(KEEP=record_id issue_reason);
    SET work.raw_survey_data;
    
    /* فحص فقدان متغير التاريخ */
    IF MISSING(event_date) THEN DO;
        issue_reason = "Missing Event Date";
        OUTPUT work.missing_log; /* عزل السجل غير المكتمل في جدول تدقيق */
    END;
    ELSE DO;
        day_val = DAY(event_date);
        month_val = MONTH(event_date);
        year_val = YEAR(event_date);
        OUTPUT work.cleaned_dates; /* حفظ السجلات السليمة */
    END;
RUN;

تضمن هذه الاستراتيجية عزل السجلات المعيبة في جدول مستقل (missing_log) لمراجعتها وتصحيحها لاحقاً، بينما تتدفق البيانات السليمة والمكتملة فقط إلى جدول التحليل الإحصائي (cleaned_dates)، مما يحفظ النزاهة العلمية ويمنع احتساب القيم المفقودة كأصفار أو تشويه الإحصاءات الوصفية.

9. استخدام التنسيقات (Formats) مقابل الدوال الحسابية لاستخراج أجزاء التاريخ

9.1 المقارنة بين التنسيق المرئي والدوال الوظيفية لاستخراج اليوم والشهر والسنة

يقع الكثير من محللي البيانات في حيرة بين استخدام “تنسيقات العرض” (Formats) مثل DAY2. أو MONTH2. أو YEAR4. لعرض أجزاء التاريخ، وبين استخدام الدوال الوظيفية الفعلية DAY() و MONTH() و YEAR() لإنشاء متغيرات جديدة. لفهم الفارق، يوضح الجدول المقارن التالي الأبعاد التقنية والتشغيلية لكل خيار:

توضح هذه المقارنة أن اختيار الأداة المناسبة يعتمد كلياً على الغرض النهائي؛ فالدوال ضرورية للنمذجة والحسابات، بينما التنسيقات مثالية للتقارير السريعة وتوفير المساحة.

وجه المقارنة استخدام الدوال الحسابية (DAY, MONTH, YEAR) استخدام تنسيقات العرض (Formats)
طبيعة المتغير الناتج متغير رقمي أصيل ومستقل في الذاكرة نفس متغير التاريخ الأصلي بقناع بصري
القيمة المخزنة فعلياً رقم صحيح مجرد (مثلاً: 5 للشهر أو 2023 للسنة) قيمة تاريخ SAS الأصلية (عدد الأيام منذ 1960)
العمليات الحسابية والمنطقية مباشرة وسريعة جداً (مثل: Year > 2020) تتطلب التعامل مع قيمة التاريخ الكاملة
استهلاك الذاكرة وحجم الملف يزيد حجم الجدول بإضافة أعمدة جديدة لا يستهلك مساحة إضافية (أعمدة أقل)
التوافق عند التصدير (Export) تُصدَّر كأعمدة أرقام واضحة ومستقلة لـ CSV/Excel قد تُصدَّر كأرقام أيام خام إذا لم يُضبط خيار التصدير

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

9.2 استخدام الدالة PUT لتحويل أجزاء التاريخ المنسقة إلى متغيرات نصية

تُعد الدالة PUT جسر التحويل الأساسي بين قيم التواريخ الرقمية والسلاسل النصية المنسقة في لغة SAS. وتعمل هذه الدالة وفق الصيغة التالية:

char_var = PUT(date_variable, format.);

على سبيل المثال، يولد التعبير PUT(trans_date, YEAR4.) سلسلة نصية مكونة من أربعة أحرف تحتوي على رقم السنة (مثل “2023”)، بينما يولد التعبير PUT(trans_date, MONNAME.) الاسم الكامل للشهر باللغة الإنجليزية (مثل “September”).

تكمن أهمية المتغيرات النصية المستخرجة عبر الدالة PUT في صياغة العناوين التلقائية للتقارير، وبناء نصوص مخصصة تظهر في الرسوم البيانية، أو إنشاء مفاتيح نصية مركبة لدمج الجداول. ولكن يكمن الخطر الجسيم في محاولة استخدام هذه المتغيرات النصية في العمليات الحسابية؛ فالسلاسل النصية لا تقبل المقارنات الرقمية الصحيحة (مثلاً: النص “9” يعتبر في الترتيب الأبجدي أكبر من النص “10”)، مما يؤدي إلى نتائج تصنيف كارثية إذا لم ينتبه المبرمج لطبيعة المتغير.

9.3 معايير الاختيار بين التنسيقات والدوال في مشاريع التحليل الإحصائي

لتحديد المسار الأمثل في المشاريع الإحصائية الاحترافية، يجب الاستناد إلى المعايير الهندسية التالية:

  • استخدم دوال التاريخ (DAY, MONTH, YEAR): عندما تحتاج إلى استخدام القيم المستخرجة في معادلات رياضية، أو في شروط فرز منطقية معقدة، أو كمتغيرات تفسيرية (Independent Variables) في نماذج الانحدار، أو عند تصدير البيانات إلى باحثين آخرين يعملون ببيئات برمجية مثل R Project أو Python لا تقرأ تنسيقات SAS الداخلية.
  • اكتفِ بتنسيقات العرض (Formats): في مراحل إعداد التقارير النهائية، وعند التعامل مع مجموعات البيانات الضخمة (Big Data) التي تتطلب الحفاظ على أقل حجم ممكن لملف البيانات على القرص الصلب، أو عند استخدام إجراءات التجميع مثل PROC TABULATE و PROC REPORT التي تستطيع تجميع البيانات بصرياً استناداً للتنسيق دون الحاجة لأعمدة مادية جديدة.

10. توظيف دوال التاريخ في التصفية والفرز والتحليل الشرطي (WHERE و IF Statements)

10.1 تصفية البيانات باستخدام دوال التاريخ في جملتي IF و WHERE

تُعد تصفية السجلات بناءً على الشروط الزمنية من أكثر العمليات تكراراً في إدارة البيانات. يتيح نظام SAS استخدام دوال التاريخ مباشرة داخل جمل التصفية WHERE و IF. على سبيل المثال، لاستخراج المشاهدات الخاصة بسنة 2022 فقط، يمكن كتابة الشرط المباشر:

WHERE YEAR(admission_date) = 2022;

من الناحية الهندسية وكفاءة المعالجة، توجد فروق جوهرية بين جملتي WHERE و IF عند تطبيق الدوال:

  • جملة WHERE: تُنفذ الشروط قبل نقل السجل إلى منطقة عمل الذاكرة (PDV) في خطوة DATA Step، كما أنها تعمل مباشرة داخل الإجراءات الإحصائية (PROC Steps). يؤدي استخدام WHERE مع الدوال إلى تحسين سرعة المعالجة وتقليل استهلاك موارد الإدخال والإخراج (I/O) بشكل كبير.
  • جملة IF (Subsetting IF): تُنفذ بعد قراءة السجل بالكامل وتجهيزه في الذاكرة. يتم اللجوء إليها إذا كان متغير التاريخ نفسه قد تم إنشاؤه أو حسابه داخل خطوة الـ DATA Step الحالية ولا يمكن لجملة WHERE الوصول إليه.

يمكن أيضاً بناء شروط متعددة الطبقات مثل استخراج عينة تغطي شهر يوليو عبر جميع السنوات: WHERE MONTH(admission_date) = 7;، أو استهداف النصف الثاني من أي شهر: WHERE DAY(admission_date) >= 16;.

10.2 إنشاء متغيرات شرطية وتصنيفية معقدة استناداً إلى أجزاء التاريخ

تسمح دوال التاريخ ببناء متغيرات تصنيفية نوعية ومؤشرات ثنائية (Dummy Variables) بدقة فائقة عبر جمل SELECT-WHEN أو IF-THEN-ELSE. يوضح الكود التالي كيفية إنشاء فئات زمنية تحليلية وتصنيف المعاملات إلى فترات سنوية ونصف سنوية:

DATA work.analytical_cohorts;
    SET work.patient_records;
    
    /* تصنيف نصف سنوي */
    IF MONTH(service_date) <= 6 THEN semi_annual = "H1";
    ELSE semi_annual = "H2";
    
    /* تصنيف الحقب الزمنية للدراسة */
    SELECT (YEAR(service_date));
        WHEN (2018, 2019) study_period = "Pre-Pandemic";
        WHEN (2020, 2021) study_period = "Pandemic Era";
        WHEN (2022, 2023) study_period = "Post-Pandemic";
        OTHERWISE study_period = "Historical/Out of Scope";
    END;
    
    /* مؤشر ثنائي لنهايات الأشهر */
    is_month_end = (DAY(service_date) >= 25);
RUN;

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

10.3 فرز وتجميع البيانات زمنياً بواسطة دوال التاريخ في PROC SORT و PROC MEANS

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

/* فرز البيانات هرمياً: بالسنة ثم بالشهر ثم باليوم */
PROC SORT DATA=work.transactions_decomposed OUT=work.sorted_transactions;
    BY trans_year trans_month trans_day;
RUN;

/* حساب المتوسطات الإحصائية ومجموع المبيعات لكل شهر وسنة */
PROC MEANS DATA=work.sorted_transactions N MEAN STD MIN MAX SUM MAXDEC=2;
    CLASS trans_year trans_month;
    VAR amount;
    TITLE "المؤشرات الإحصائية الوصفية للمبيعات مجمعة حسب السنة والشهر";
RUN;

تُظهر مخرجات PROC MEANS تقريراً إحصائياً هرمياً بالغ الدقة يوضح عدد المشاهدات، والمتوسط الحسابي، والانحراف المعياري، وإجمالي المبالغ لكل تركيبة من السنة والشهر، مما يكشف للمحلل عن الاتجاه العام وتغيرات الأداء المالي بوضوح شديد.

11. استخدام دوال DAY و MONTH و YEAR في استعلامات PROC SQL

11.1 تكامل دوال التاريخ القياسية داخل بيئة PROC SQL في SAS

يدعم محرك PROC SQL في SAS دوال التاريخ القياسية بسلاسة تامة وتوافق كامل مع معايير SQL الموسعة. يستطيع المبرمج استدعاء دوال DAY(date) و MONTH(date) و YEAR(date) مباشرة داخل عبارة SELECT لاستخراج الأجزاء الزمنية أثناء إنشاء الجداول المؤقتة أو الدائمة دون الحاجة لكتابة خطوة DATA Step منفصلة.

يوضح الاستعلام التالي كيفية استخراج الأجزاء الزمنية وتسمية الأعمدة الناتجة باستخدام الأسماء المستعارة (Aliases) داخل استعلام SQL في SAS:

PROC SQL;
    CREATE TABLE work.sql_date_extraction AS
    SELECT
        trans_id,
        trans_date,
        DAY(trans_date) AS transaction_day,
        MONTH(trans_date) AS transaction_month,
        YEAR(trans_date) AS transaction_year,
        amount
    FROM work.transactions;
QUIT;

يتميز هذا الأسلوب بالسرعة والاندماج المباشر في بيئات قواعد البيانات العلائقية ومستودعات البيانات، حيث تُعامل الدوال بنفس الكفاءة الحسابية وتنتج أعمدة رقمية متوافقة تماماً مع بقية إجراءات SAS.

11.2 التجميع والحسابات الإحصائية باستخدام GROUP BY مع دوال التاريخ

تتجلى القوة الحقيقية لـ PROC SQL عند دمج دوال التاريخ مع جملة التجميع GROUP BY والدوال التجميعية القياسية مثل COUNT() و SUM() و AVG(). يتيح ذلك تلخيص البيانات وحساب المقاييس الإحصائية على مستوى السنة أو الشهر في خطوة برمجية موجزة وقوية:

PROC SQL;
    CREATE TABLE work.yearly_monthly_summary AS
    SELECT
        YEAR(trans_date) AS report_year,
        MONTH(trans_date) AS report_month,
        COUNT(*) AS total_transactions,
        SUM(amount) AS total_volume FORMAT=DOLLAR12.2,
        AVG(amount) AS average_amount FORMAT=DOLLAR10.2
    FROM work.transactions
    GROUP BY
        calculated report_year,
        calculated report_month
    HAVING total_volume > 1000
    ORDER BY
        report_year,
        report_month;
QUIT;

تسمح الكلمة المفتاحية calculated في SAS SQL بإعادة استخدام الأسماء المستعارة المحسوبة مباشرة داخل جملتي GROUP BY و WHERE، بينما تقوم جملة HAVING بفلترة النتائج التجميعية لاستبقاء الفترات الزمنية ذات الحجم المالي الأعلى من 1000 دولار فقط، وهو ما يمثل نموذجاً فائق الكفاءة في معالجة التقارير التحليلية التنفيذية.

11.3 دمج الجداول (Table Joins) بالاعتماد على تطابق أجزاء التاريخ

في كثير من مشاريع الربط الإحصائي، نحتاج إلى دمج جدول يحتوي على معاملات يومية مع جدول آخر يحتوي على مؤشرات اقتصادية كلية مسجلة على مستوى شهري أو سنوي فقط (مثل معدل التضخم الشهري أو سعر الصرف السنوي). تتيح دوال التاريخ في PROC SQL إجراء هذا الربط المتقدم (Table Join) بسهولة استناداً إلى تطابق السنة والشهر بين السجلين:

PROC SQL;
    CREATE TABLE work.transactions_with_macro AS
    SELECT
        T.trans_id,
        T.trans_date,
        T.amount,
        M.inflation_rate,
        M.consumer_confidence_index
    FROM work.transactions AS T
    LEFT JOIN work.macro_monthly_indicators AS M
        ON YEAR(T.trans_date) = M.indicator_year
        AND MONTH(T.trans_date) = M.indicator_month;
QUIT;

يتغلب هذا الاستعلام ببراعة على مشكلة اختلاف التردد الزمني (Mismatched Granularity) بين الجداول، حيث يربط كل معاملة يومية بالمؤشر الاقتصادي المقابل لشهرها وسنتها المحددة، مما ينتج جدول بيانات غنياً وجاهزاً للنمذجة الاقتصادية والتحليل متعدد المستويات.

12. أفضل الممارسات، وتجنب الأخطاء الشائعة، وتحسين كفاءة الكود في SAS

12.1 الأخطاء الشائعة عند تطبيق دوال التاريخ وكيفية تصحيحها

يواجه المبرمجون في بيئة SAS مجموعة من الأخطاء المتكررة عند التعامل مع دوال التاريخ. يستعرض الجدول التحليلي التالي أبرز هذه الأخطاء، وأسبابها البرمجية، وكيفية تصحيحها لضمان كفاءة التنفيذ:

يوضح هذا الجدول أهمية التدقيق في أنواع البيانات والمفاهيم الكامنة وراء دوال التواريخ لضمان خلو الأكواد من الأخطاء الصامتة (Silent Errors).

الخطأ الشائع السبب البرمجي للخطأ السلوك الناتج في SAS الحل البرمجي الصحيح
تمرير متغير نصي للدالة تمرير تاريخ مخزن كـ Character دون تحويل مسبق تحويل ضمني فاشل، قيم مفقودة .، وملاحظات في Log استخدام INPUT(char_var, ANYDTDTE.) أولاً
استخدام ثوابت نصية دون اللاحقة ‘d’ كتابة التاريخ مثل '01JAN2023' بدلاً من '01JAN2023'd يعامله SAS كنص عادي وليس كرقم تاريخ إضافة الحرف d بعد علامة الاقتباس لتأكيد الثابت الزمني
توقع اسم الشهر كنص من دالة MONTH افتراض أن دالة MONTH تُرجع “May” بدلاً من الرقم 5 فشل المقارنات الشرطية النصية استخدام PUT(date, MONNAME.) للحصول على الاسم النصي
الخلط بين تنسيق السنة وقيمتها مقارنة المتغير المنسق بـ YEAR2. برقم من رقمين أخطاء منطقية؛ القيمة المخزنة تظل السنة كاملة مقارنة مخرجات دالة YEAR() بأربعة أرقام دائماً (مثل 2023)

تساعد معرفة هذه الأخطاء وتجنبها على ضمان استقرار التطبيقات البرمجية وتقليل الوقت المستغرق في تصحيح الأخطاء (Debugging) في المشاريع التحليلية الحساسة.

12.2 تحسين كفاءة المعالجة وسرعة التنفيذ مع مجموعات البيانات الكبيرة

عند معالجة مجموعات البيانات الضخمة التي تحتوي على مئات الملايين من السجلات، يصبح ترشيد استهلاك الذاكرة والمعالج أمراً حيوياً للغاية. لتحقيق أقصى كفاءة برمجية، يُنصح بتجنب الاستدعاء المتكرر لنفس الدالة داخل الشروط المتتالية؛ فبدلاً من كتابة IF YEAR(date)=2022 ... ELSE IF YEAR(date)=2023، يفضل استخراج قيمة السنة مرة واحدة وحفظها في متغير مؤقت أو دائم، ثم بناء الشروط على ذلك المتغير المستخرج.

يُنصح أيضاً باستخدام خيارات التحكم في الأعمدة مثل DROP و KEEP لإسقاط المتغيرات الزمنية الوسيطة غير الضرورية بعد انتهاء مرحلة التصفية والتصنيف، مما يقلل من العرض الأفقي للسجل (Record Length) ويوفر مساحات تخزينية هائلة وسرعة أكبر في قراءة الجداول من القرص الصلب.

علاوة على ذلك، في الاستعلامات التجميعية الضخمة، يُفضل دائماً تصفية البيانات أولاً باستخدام جملة WHERE قبل تطبيق دوال التفكيك الزمني لتقليل عدد المشاهدات التي تحتاج إلى معالجة حسابية، مما ينعكس بشكل ملحوظ على خفض زمن التنفيذ الكلي (CPU Time).

12.3 قواعد التوثيق البرمجي وضمان سلامة البيانات في المشاريع الإحصائية

تتطلب الحوكمة البرمجية في المشاريع الإحصائية توثيقاً دقيقاً لكافة مراحل التحويل الزمني لضمان قابلية إعادة الإنتاجية (Reproducibility) ومراجعة الأقران. يجب أن تتضمن الأكواد تعليقات توضيحية (Comments) شاملة تشرح المنطق الكامن وراء تفكيك التواريخ، والقرارات المتخذة بشأن كيفية إدارة القيم المفقودة والسنوات الكبيسة.

ينبغي توحيد معايير تسمية المتغيرات الزمنية المستخرجة عبر جميع برامج المشروع (مثلاً: اعتماد البادئة trans_ متبوعة بـ year أو month أو day)، واستخدام عبارات LABEL لمنح كل عمود توصيفاً إحصائياً واضحاً يظهر في مخرجات التحليل.

أخيراً، يجب إدراج خطوات فحص وتأكيد آلية للبيانات (Data Validation Steps) بعد عمليات التفكيك، مثل استخدام PROC FREQ أو فحص القيم القصوى والدنيا للمتغيرات المستخرجة للتحقق من أن أرقام الأيام تقع حصراً بين 1 و 31 والشهور بين 1 و 12، مما يضمن خلو البيانات النهائية من أي شذوذ ناتج عن أخطاء القراءة أو التحويل.

الخاتمة

تمثل دوال التاريخ الأساسية DAY و MONTH و YEAR في برنامج SAS أدوات لا غنى عنها لأي باحث أو محلل بيانات يسعى إلى تحويل البيانات الزمنية المركبة إلى أبعاد إحصائية دقيقة وقابلة للقياس والنمذجة. من خلال فهم البنية الرياضية العميقة لتخزين التواريخ في SAS كنقاط عددية تستند إلى الأول من يناير 1960، واستيعاب التمايز الجوهري بين القيم المخزنة وتنسيقات العرض الظاهرية، يستطيع المتخصص توظيف هذه الدوال بأعلى درجات الكفاءة سواء داخل خطوة البيانات التقليدية أو عبر استعلامات PROC SQL المتقدمة.

إن التطبيق المنهجي لهذه الدوال، المقترن بإدارة واعية للقيم المفقودة وتطبيق أفضل ممارسات كتابة الأكواد وتوثيقها، يضمن سلامة التحليلات الإحصائية ويوفر الأساس المتين لدراسة الأنماط الموسمية والاتجاهات طويلة الأجل بدقة وموثوقية علمية فائقة ترتقي بجودة القرارات المبنية على البيانات.

المراجع (References)

اقتباس هذا المقال

looti, M. (2026, أغسطس 30). كيفية استخدام دوال DAY و MONTH و YEAR في SAS. عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-use-day-month-year-functions-in-sas/
looti, Mohammed. “كيفية استخدام دوال DAY و MONTH و YEAR في SAS.” عرب سايكلوجي, 30 أغسطس 2026, https://arabpsychology.com/statistics/how-to-use-day-month-year-functions-in-sas/.
looti, Mohammed. “كيفية استخدام دوال DAY و MONTH و YEAR في SAS.” عرب سايكلوجي. أغسطس 30, 2026. https://arabpsychology.com/statistics/how-to-use-day-month-year-functions-in-sas/.