كيفية استخدام دالة TODAY في SAS (مع أمثلة)

دليل أكاديمي شامل يشرح كيفية استخدام دالة TODAY في نظام SAS لتوليد التواريخ الحالية، وتنسيقها، وتوظيفها في التحليلات الإحصائية المتقدمة.

Mohammed looti أكاديمي وباحث متخصص في علم النفس
تاريخ النشر
تمت المراجعة العلمية · د. مروة عبد العظيم · 20 أكتوبر، 2026
مراجعة وتدقيق علمي معتمد تاريخ التدقيق: 20 أكتوبر، 2026
د. مروة عبد العظيم دكتوراه في علم النفس
عضو هيئة التدريس • جامعة كربلاء
معايير التدقيق والاعتماد السريري

يخضع هذا المحتوى لمعايير ضبط الجودة والتدقيق العلمي والأكاديمي الصارمة في شبكة علم النفس العربي، لضمان صحة المعلومات ودقتها السريرية ومطابقتها لأحدث الأدلة والبراهين الصادرة عن الجمعيات النفسية والطبية المعتمدة (APA / WHO).

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

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

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

1. مقدمة إلى دالة TODAY في بيئة SAS الإحصائية

1.1 المفهوم الرياضي والبرمجي لدالة TODAY

تُعرّف دالة TODAY في البنية البرمجية لنظام SAS بأنها دالة حسابية خالية من المعاملات (Zero-argument Function)، صُممت خصيصاً لاستدعاء التاريخ التقويمي اللحظي المسجل في النظام. من الناحية الرياضية، لا تُنتج الدالة نصاً تقويمياً مجرداً، بل تُعيد عدداً صحيحاً يمثل الإزاحة الزمنية الموجبة أو السالبة بوحدة الأيام قياساً إلى نقطة مرجعية ثابتة معتمدة داخل بيئة النظام. وتتكامل هذه العملية برمجياً من خلال بروتوكولات اتصال منخفضة المستوى تستعلم مباشرة عن التوقيت المسجل في النواة الحسابية للنظام المضيف (Operating System Kernel).

تعمل الدالة كحلقة وصل حيوية بين العتاد الصلب للحاسوب والمتغيرات التحليلية ضمن خطوة البيانات (DATA Step). فعندما يُترجم المترجم البرمجي لنظام SAS تعليمة الاستدعاء، فإنه يوجّه طلباً لمقاطعة برمجية تستعلم عن ساعة النظام، ومن ثم تحويل القيمة المسترجعة إلى قيمة عددية قياسية وتخزينها في متجه بيانات البرنامج (Program Data Vector – PDV). يضمن هذا الإجراء أقصى درجات الاتساق الحسابي، حيث يتطابق الناتج تماماً مع التوقيت الفعلي للحظة تنفيذ المعالجة داخل بيئة التحليل، مما يجعلها أداة لا غنى عنها في التوثيق الآلي لبيانات الرصد والتحليل التجريبي والوبائي.

1.2 أهمية التعامل مع التواريخ الحالية في التحليلات الإحصائية

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

علاوة على ذلك، تسهم دالة TODAY بفاعلية في بناء مؤشرات المتابعة الحية ومؤشرات الأداء الرئيسية (KPIs) في بيئات التحليل الإداري والأكاديمي. ومن خلال ربط هذه الدالة بنماذج الانحدار وتحليلات البقاء (Survival Analysis)، يستطيع الإحصائي احتساب مدة الرقابة (Censoring Time) للمشاركين الذين لم يختبروا الحدث المدروس حتى لحظة التحليل، مما يضمن اتساق البيانات الإحصائية وحداثتها المطلقة، ويوفر بيئة موحدة لمعايرة النماذج التنبؤية عبر مختلف المراحل الزمنية للدراسة.

1.3 بنية الجملة البرمجية (Syntax) ومعايير الاستدعاء

تتميز بنية استدعاء دالة TODAY بالبساطة الصارمة، حيث تتبع الصيغة القياسية للدوال التي لا تأخذ مدخلات في لغات البرمجة الإحصائية. تُكتب الدالة برمجياً على النحو: variable_name = TODAY();. يشترط مترجم SAS البرمجي وجود القوسين المفتوح والمغلق دون أي مسافات أو قيم بيّنية بينهما، وذلك لتمييزها بصرياً وبرمجياً عن المتغيرات العادية المعرفة من قِبل المستخدم. وإذا قام المبرمج بتمرير أي وسيطة داخل القوسين، يقوم النظام بإيقاف عملية الترجمة وإصدار رسالة خطأ صريحة في سجل المعالجة (SAS Log) تفيد بتجاوز عدد المعاملات المسموح به.

تتطابق الدالة وظيفياً في بيئات العمل المتعددة لحزمة SAS، سواء نُفذت الشيفرة البرمجية عبر واجهة SAS Enterprise Guide، أو بيئة SAS Studio السحابية، أو الأوامر الطرفية لنظام SAS المدمج في الخوادم الكبيرة (Mainframes) وخوادم Linux/Unix. كما تتمتع الدالة بالمرونة التي تسمح باستخدامها كطرف أيمن في العمليات الحسابية المباشرة، أو كمعامل داخل دوال أخرى مركبة كدوال الفروق الزمنية والتحويلات الهيكلية للبيانات، مما يمنحها توافقية شاملة عبر كافة قطاعات خطوة البيانات.

2. الأساس النظري لنظام تواريخ SAS والقيمة الرقمية الافتراضية

2.1 نقطة الأساس الصفرية (1 يناير 1960) وتفسيرها الحسابي

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

يعود اختيار الأول من يناير 1960 كنقطة مرجعية لنظام SAS إلى اعتبارات برمجية وهندسية تعود إلى مطلع سبعينيات القرن العشرين، حيث توازى ذلك مع معايير الحوسبة السائدة لشركة IBM وأنظمتها الشهيرة (System/360). وفر هذا الاختيار توازناً مثالياً في حجز المساحة الذاكرية وتفادي مشكلات تجاوز السعة العددية (Integer Overflow) عند تمثيل التواريخ التاريخية والمستقبلية. يوضح الجدول التالي نماذج لتمثيل التواريخ في نظام SAS وفق نقطة الأساس المذكورة:

  • تاريخ 31 ديسمبر 1959: يقابله رقمياً القيمة -1.
  • تاريخ 1 يناير 1960: يقابله رقمياً القيمة 0.
  • تاريخ 2 يناير 1960: يقابله رقمياً القيمة 1.
  • تاريخ 1 يناير 2020: يقابله رقمياً القيمة 21915 (يوماً منقضياً).

2.2 حساب الأيام المتتالية والتمثيل الرقمي الداخلي

تُخزّن جميع متغيرات التواريخ في SAS كمتغيرات عددية عائمة (Floating-point Numeric Variables) بدقة مزدوجة، تشغل افتراضياً ثمانية بايتات في الذاكرة العشوائية. يُمكّن هذا التمثيل الرقمي التتابعي البحت النظام الإحصائي من تنفيذ العمليات الرياضية المعقدة بأعلى كفاءة خوارزمية ممكنة، إذ تتحول المقارنات الزمنية الصعبة وعمليات الفرز والترتيب إلى مقارنات عددية بسيطة لا تستهلك موارد المعالجة المركزية (CPU Cycles).

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

2.3 الفروق الجوهرية بين التخزين الرقمي والعرض المرئي

من أهم المفاهيم البرمجية التي يجب على باحث SAS استيعابها استيعاباً عميقاً هو الفصل التام بين “القيمة المخزنة في الذاكرة” (Stored Value) و”القيمة المعروضة للمستخدم” (Displayed Value). فالرقم المخزن داخلياً في ملف البيانات (SAS Data Set) يظل دائماً وأبداً عدداً حقيقياً مجرداً يمثل الأيام. أما الهيئة التقويمية المألوفة للإنسان، مثل (15/05/2023) أو (15MAY2023)، فليست سوى قناع بصري خارجي يتم إلباسه للرقم الداخلي بواسطة محرك التنسيق في SAS دون أي تغيير في البنية الرقمية التحتية للمتغير.

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

3. التطبيق الأساسي: توليد التاريخ الحالي بدون تنسيق

3.1 بناء جملة خطوة البيانات (DATA Step) لإنشاء التاريخ

يبدأ التطبيق العملي لدالة TODAY من خلال كتابة خطوة بيانات أساسية لإنشاء مجموعة بيانات جديدة تحتوي على التاريخ اللحظي. يتم ذلك عبر حجز اسم متغير جديد في جدول البيانات وإسناد مخرجات الدالة إليه مباشرة. وتتطلب هذه العملية التقيد بالهيكلية الصارمة لخطوة البيانات في SAS لضمان تنفيذ المترجم البرمجي للأمر بشكل صحيح وسليم في ذاكرة العمل المؤقتة (Work Library).

يوضح النموذج البرمجي التالي كيفية إنشاء جدول بيانات بسيط يتضمن تاريخ اليوم كقيمة عددية خام:

DATA work.test_date;
    current_date_raw = TODAY();
RUN;

في هذا النموذج، تبدأ خطوة البيانات بالأمر DATA متبوعاً باسم الجدول test_date ضمن مكتبة العمل المؤقتة. يقوم المتغير current_date_raw باستقبال القيمة الرقمية الناتجة عن تنفيذ الدالة TODAY() عند معالجة السطر الأول في مرحلة التنفيذ. وتختتم الخطوة بالتعليمة RUN، التي تصدر الأمر لمحرك SAS بمعالجة متجه بيانات البرنامج وتثبيت السجل الناتج داخل الجدول النهائي وتفريغ الذاكرة المؤقتة للعملية اللاحقة.

3.2 استعراض النتائج عبر إجراء الطباعة PROC PRINT

بمجرد اكتمال خطوة البيانات السابقة وتوليد المتغير الخام، يمكن استخدام إجراء الطباعة القياسي PROC PRINT لمعاينة المحتوى المسجل في جدول البيانات الناتج والتحقق من صحته. يُعد هذا الإجراء الطريقة الأساسية لمراجعة مخرجات الجداول في بيئة SAS والتأكد من نجاح العمليات المنطقية والحسابية المنفذة.

تتم عملية الاستعراض بتطبيق الكود التالي:

PROC PRINT DATA=work.test_date NOOBS;
RUN;

يؤدي تنفيذ هذا الأمر إلى ظهور نافذة المخرجات (Results Viewer) متضمنة عموداً واحداً يحمل التسمية current_date_raw، وتحته رقم مجرد يمثل عدد الأيام المنقضية (على سبيل المثال: 23545 إذا طُبق الكود في فترة زمنية معينة). يُظهر هذا الخرج بوضوح أن النظام لم يقم تلقائياً بتحويل الرقم إلى صيغة تقويمية، بل تركه بهيئته الرياضية البحتة، مما يؤكد أن الدالة بحد ذاتها لا تفرض أي قالب إظهار، بل تكتفي بمهمة القياس والحساب الزمني الرقمي فقط.

3.3 الآثار المترتبة على استخدام القيمة الخام في التحليلات

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

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

4. تنسيق التواريخ في SAS باستخدام تنسيق DDMMYY10.

4.1 دور تعليمة FORMAT في تخصيص مظهر المتغيرات

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

يمكن تضمين تعليمة FORMAT داخل خطوة البيانات (DATA Step)، مما يجعل التنسيق سمة دائمة مرتبطة بالمتغير داخل واصف البيانات التابع للجدول (Data Set Descriptor Portion)، أو يمكن إضافتها بصورة مؤقتة ضمن إجراءات التحليل والطباعة مثل PROC PRINT وPROC REPORT لتغيير مظهر المتغير مؤقتاً لأغراض العرض الحالي فقط. هذا الفصل التام بين كينونة التخزين ومظهر العرض يتيح للمحلل أعلى درجات المرونة الإحصائية، حيث تظل جميع الحسابات الرياضية تجري بدقة الأعداد الصحيحة، بينما تظهر المخرجات متوافقة مع القواعد اللغوية والإدارية المعتمدة لدى الجهة المستفيدة من التحليل.

4.2 تطبيق ومزايا التنسيق القياسي DDMMYY10.

يُعد تنسيق DDMMYY10. أحد أكثر تنسيقات التواريخ شيوعاً واستخداماً في البيئات الإدارية والأكاديمية، لا سيما في المنظومات التي تعتمد الترتيب القياسي: اليوم، يليه الشهر، ثم السنة. يتكون اسم التنسيق من اختصار عناصره المكونة: (DD) لليوم برقمين، و(MM) للشهر برقمين، و(YY) للسنة، متبوعاً بالرقم الكلي للعرض (10 خانات) متبوعاً بالنقطة الإلزامية التي تميز جميع تنسيقات SAS عن أسماء المتغيرات البرمجية.

يوضح المثال البرمجي التالي كيفية استدعاء دالة TODAY وتطبيق تنسيق DDMMYY10. مباشرة لضمان ظهور التاريخ بصيغة مقروءة تتضمن اليوم والشهر والسنة المكونة من أربعة أرقام، مفصولة بشرطات مائلة:

DATA work.formatted_date;
    current_date = TODAY();
    FORMAT current_date DDMMYY10.;
RUN;

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

4.3 معاينة المخرجات في السجل باستخدام عبارة PUT

توفر عبارة PUT في خطوة البيانات بيئة تشخيصية وتحليلية فورية تسمح للمبرمج بفحص قيم المتغيرات وإرسالها مباشرة إلى سجل العمليات (SAS Log) أثناء مرحلة تنفيذ الكود البرمجي دون الحاجة لانتظار إنشاء الجدول وطباعته عبر إجراءات منفصلة. وتكتسب هذه الأداة أهمية كبرى عند التحقق من سلامة استدعاء الدالة وتطبيق التنسيقات في بيئات التطوير والاختبار المتقدمة.

يمكن كتابة الشيفرة التالية لمعاينة الفرق الجوهري بين القيمة الخام والقيمة المنسقة في السجل مباشرة:

DATA _NULL_;
    raw_date = TODAY();
    PUT "Raw Numeric Value: " raw_date;
    PUT "Formatted Value: " raw_date DDMMYY10.;
RUN;

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

5. تنسيقات إضافية للتواريخ: تطبيق تنسيق DATE9. والتنسيقات الشائعة

5.1 استخدام تنسيق DATE9. ومواصفات العرض الأبجدية الرقمية

يحتل تنسيق DATE9. مكانة مركزية في ممارسات تحليل البيانات الطبية والبيولوجية وإدارة التجارب السريرية المنفذة بلغة SAS، لما يوفره من وضوح قطعي يمنع اللبس بين الأيام والأشهر. يقوم هذا التنسيق بعرض التاريخ عبر تسع خانات متتالية، تشمل خانتين لليوم، تليها ثلاثة أحرف أبجدية تمثل الاختصار اللاتيني للشهر (مثل JAN، FEB، MAR)، ثم أربعة أرقام تخصص لتمثيل السنة الكاملة، دون وجود أي محددات أو فواصل بين تلك الأجزاء.

يمكن تطبيق هذا التنسيق العملي باتباع الخطوات البرمجية التالية:

DATA work.clinical_tracking;
    extraction_date = TODAY();
    FORMAT extraction_date DATE9.;
RUN;

يظهر ناتج هذا التنسيق في هيئة بصرية نموذجية مثل 15MAY2023. تكمن القوة المنهجية لهذا النمط في القضاء التام على المعضلات الناتجة عن اختلاف الثقافات الحسابية؛ ففي الوقت الذي قد يُقرأ فيه التنسيق الرقمي المجرد (05/06/2023) في الولايات المتحدة كـ “الخامس من يونيو” وفي المملكة المتحدة كـ “السادس من مايو”، فإن DATE9. يقدم تمثيلاً موحداً لا يحتمل أي تضارب دلالي، وهو ما تجعله هيئات التنظيم الدوائي العالمية، مثل هيئة الغذاء والدواء الأمريكية (FDA)، المعيار المفضل في توثيق قواعد البيانات التحليلية المجمعة (CDISC Standards).

5.2 مقارنة تحليلية بين التنسيقات: MMDDYY10. وYYMMDD10. وDATE9.

تتعدد تنسيقات التواريخ في حزمة SAS لتلائم مختلف البيئات التشغيلية والبروتوكولات الدولية المعتمدة. يعتمد تنسيق MMDDYY10. القالب الشائع في الولايات المتحدة الأمريكية، حيث يُقدّم الشهر أولاً برقمين، يليه اليوم برقمين، ثم السنة بأربعة أرقام (مثل: 05/15/2023). ورغم انتشاره الواسع في الأنظمة المالية الأمريكية، إلا أنه يسبب مشكلات كبيرة في التوافق عند تداول قواعد البيانات مع مؤسسات تتبنى المعايير الدولية.

في المقابل، يمثل تنسيق YYMMDD10. التطبيق البرمجي لمعيار المنظمة الدولية للمعايير ISO 8601، والذي يفرض ترتيباً تنازلياً يبدأ بالسنة، تليها شرطة مائلة أو فاصلة، ثم الشهر، فالأيام (مثل: 2023/05/15). وتكمن الميزة الحسابية الفائقة لهذا التنسيق في تطابق الترتيب الأبجدي للنصوص مع الترتيب الزمني للأحداث، مما يجعله الخيار الأمثل لعمليات أرشفة البيانات وتسمية الملفات المؤتمتة وتصدير الجداول الإحصائية إلى قواعد البيانات العلائقية (Relational Databases) لضمان عدم اضطراب الترتيب الزمني عند تبادل البيانات بين المنصات المختلفة.

5.3 التحكم في المحددات والفواصل الزمنية داخل التنسيق

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

يوضح النموذج التالي نماذج من تلك التنسيقات المخصصة:

  • تنسيق DDMMYYD10.: يستخدم الشرطة الأفقية (Dash) كفاصل بين الأجزاء ليعرض التاريخ بالصورة: 15-05-2023.
  • تنسيق DDMMYYP10.: يستخدم النقطة (Period) كفاصل زمني ليعرض التاريخ بالهيئة: 15.05.2023.
  • تنسيق DDMMYYB10.: يستخدم الفراغ الأبيض (Blank) كفاصل بدلاً من الرموز ليعرض التاريخ هكذا: 15 05 2023.
  • تنسيق DDMMYYC10.: يستخدم النقطتين الرأسيتين (Colon) في الفصل الزمني.

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

6. العمليات الحسابية والمنطقية المتقدمة باستخدام دالة TODAY

6.1 حساب الفواصل الزمنية والأعمار بدقة (دوال INTCK وYRDIF)

تكتمل قوة دالة TODAY عند دمجها مع الدوال المتخصصة في حساب الفواصل والمدد الزمنية مثل دالتي YRDIF وINTCK. فرغم إمكانية حساب الفارق الزمني بالأيام عن طريق طرح تاريخين طرحاً جبرياً مباشراً (days_diff = TODAY() - birth_date;)، إلا أن حساب الأعمار والمدد بالسنوات أو الأشهر يتطلب معالجة الفروق المعقدة في أطوال الأشهر وتكرار السنوات الكبيسة، وهو ما لا يستوعبه الطرح الرياضي البسيط عبر القسمة على 365.25.

تُعد دالة YRDIF الأداة الرياضية الأكثر دقة لحساب الفروق بالسنوات، وتتطلب تحديد الأساس الحسابي (Basis) لمعالجة الأيام والسنوات الكبيسة بدقة تامة، كما يوضح المثال التالي:

DATA work.cohort_analysis;
    SET work.participants;
    current_age = YRDIF(birth_date, TODAY(), 'AGE');
    exact_years = YRDIF(enrollment_date, TODAY(), 'ACT/ACT');
    FORMAT current_age 5.1 exact_years 6.2;
RUN;

في هذا السياق، يقوم الأساس 'AGE' باحتساب العمر الإنساني بدقة قانونية وأكاديمية مطابقة للأعراف الاجتماعية، بحيث لا يزداد العمر سنة كاملة إلا عند حلول الذكرى السنوية للميلاد. أما المعامل 'ACT/ACT' فيقوم بحساب النسبة الفعلية لأيام السنة استناداً إلى الحساب الفعلي للأيام والسنوات الكبيسة، وهو المعيار المعتمد في الحسابات المالية والتأمينية المتقدمة (Actuarial Science).

من جانب آخر، توظف دالة INTCK لحساب عدد الفترات المكتملة الفاصلة بين تاريخين، كحساب عدد الأشهر أو الأسابيع أو الفصول السنوية التي انقضت بين تاريخ الدخول في الدراسة وتاريخ اليوم الحالي، وفق الصيغة: months_elapsed = INTCK('MONTH', start_date, TODAY(), 'CONTINUOUS');، مما يمنح الإحصائي رؤية زمانية شاملة لحركة العينات وتتبعها عبر الزمن.

6.2 تصفية السجلات واختيار العينات استناداً إلى التاريخ الحالي

تلعب دالة TODAY دوراً محورياً في عمليات استخلاص وتصفية البيانات (Data Subsetting) من خلال دمجها المباشر في عبارات WHERE الشرطية ضمن خطوات البيانات أو الإجراءات التحليلية. يتيح هذا الاستخدام إمكانية بناء استعلامات ديناميكية تتكيف تلقائياً مع مرور الوقت دون الحاجة إلى إعادة ضبط معايير الاستخراج اليدوي للتواريخ.

يوضح الكود التالي تطبيقاً عملياً لاستخراج السجلات النشطة التي تمت إضافتها خلال الثلاثين يوماً الماضية فقط استناداً إلى اللحظة الزمنية الحالية:

PROC PRINT DATA=work.patient_records;
    WHERE visit_date >= (TODAY() - 30);
RUN;

تتم معالجة هذا الشرط في مرحلة الترجمة قبل قراءة السجلات بالكامل إلى الذاكرة، حيث يقوم المحرك بتقييم ناتج (TODAY() - 30) كعدد صحيح ثابت يمثل التاريخ المرجعي، ثم يجري المقارنة الرقمية السريعة عبر فهرس البيانات. يمكن للمحلل أيضاً بناء شروط مركبة لعزل الحالات التي وقعت في الشهر الحالي باستخدام دالة الفواصل: WHERE INTCK('MONTH', record_date, TODAY()) = 0;، مما يؤتمت عمليات الرقابة السريرية والتدقيق الإحصائي المستمر على تدفق البيانات المسجلة.

6.3 إنشاء مؤشرات زمنية ديناميكية وسلاسل زمنية تتبعية

في إطار تجهيز المتغيرات للتحليلات الإحصائية متعددة المتغيرات ونماذج المخاطر التناسبية (Cox Proportional Hazards Models)، تبرز الحاجة إلى بناء مؤشرات زمنية ثنائية وديناميكية (Binary Time Flags) تحدد وضع الحالة المدروسة بالنسبة لليوم الراهن. تُستخدم هذه المؤشرات للتفريق بين الأفراد الذين تجاوزوا مدداً زمنية حرجة وأولئك الذين ما زالوا في طور المتابعة النشطة.

يمكن بناء هذه المتغيرات الشرطية وفق المثال الإيضاحي التالي:

DATA work.survival_data;
    SET work.clinical_trials;
    days_in_study = TODAY() - enrollment_date;
    IF days_in_study > 365 THEN long_term_participant = 1;
    ELSE long_term_participant = 0;
    
    SELECT;
        WHEN (days_in_study < 90) followup_phase = "Phase 1: Initial ";
        WHEN (days_in_study < 180) followup_phase = "Phase 2: Intermediate";
        OTHERWISE followup_phase = "Phase 3: Extended ";
    END;
RUN;

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

7. المقارنة بين دالة TODAY والدوال الزمنية المشابهة في SAS

7.1 المقارنة بين دالة TODAY ودالة DATE

يثور في كثير من الأحيان التساؤل بين مبرمجي SAS حول الاختلافات الجوهرية والوظيفية بين دالتي TODAY() وDATE(). ومن الناحية الفنية والمعمارية الصرفة في نواة محرك SAS، لا يوجد أي فرق على الإطلاق بين هاتين الدالتين؛ إذ تُعد دالة DATE() مرادفاً مطابقاً كلياً (Exact Synonym/Alias) لدالة TODAY(). كلتاهما تستدعيان الروتين البرمجي الداخلي ذاته لاسترجاع تاريخ النظام الحالي، وتعيدان القيمة العددية ذاتها كعدد أيام صحيح منذ الأول من يناير 1960.

يرجع سبب وجود دالتين متطابقتين إلى المسار التاريخي لتطوير لغة SAS ورغبة مطوري النظام الأوائل في الحفاظ على التوافق الرجعي (Backward Compatibility) للشيفرات البرمجية القديمة المكتوبة منذ العقود الأولى لظهور النظام، بالإضافة إلى التوافق مع المعايير الاصطلاحية لمختلف المدارس الإحصائية. ورغم هذا التطابق الوظيفي، فإن العرف البرمجي الأكاديمي والمهني الحديث يفضل استخدام TODAY() بشكل شبه حصري، نظراً لكون الاسم دالاً دلالة صريحة وواضحة على استرجاع “اليوم الحالي”، في حين قد يوحي اسم DATE() للمبرمج المبتدئ خطأً بأنه دالة لتحويل النصوص إلى تواريخ أو قراءة التواريخ المدخلة.

7.2 الفروق الجوهرية مع دوال الوقت والتاريخ والوقت (TIME وDATETIME)

من الضروري الفصل المنهجي بين دالة TODAY والدوال الأخرى المسؤولة عن معالجة الوقت أو الجمع بين التاريخ والوقت معاً، نظراً للاختلاف الجذري في الوحدات القياسية ونقاط الأصل المستخدمة لكل منها في البنية الداخلية للغة SAS. يوضح العرض المقارن التالي هذه الفروق الأساسية:

  • دالة TODAY(): تقيس التاريخ فقط، ووحدتها الحسابية هي الأيام الكاملة المنقضية منذ منتصف ليل 1 يناير 1960. قيمتها تتغير مرة واحدة كل 24 ساعة.
  • دالة TIME(): تسترجع توقيت اللحظة الحالية من ساعة النظام، ووحدتها الحسابية هي الثواني المنقضية منذ منتصف الليل الأخير (Midnight). تتراوح قيمتها بين 0 و86399.999... ثانية في اليوم الواحد، ولا تتضمن أي معلومات تاريخية تراكمية.
  • دالة DATETIME(): تجمع بين التاريخ والوقت في مقياس واحد فائق الدقة، ووحدتها الحسابية هي إجمالي الثواني التراكمية المنقضية منذ منتصف ليل الأول من يناير 1960 وحتى الثانية الحالية.

يوضح هذا التباين خطورة الخلط بين هذه المتغيرات في الحسابات؛ إذ إن طرح ناتج دالة TODAY من ناتج دالة DATETIME هو خطأ منطقي فادح يُشبه طرح وحدات الأمتار من الكيلوغرامات، لاختلاف الأساس المرجعي والوحدة المقاسة اختلافاً كلياً. يتطلب التنسيق والتحويل بين هذه الأنماط استخدام دوال تحويل متخصصة مثل DATEPART() لاستخراج الأيام من متغير التاريخ والوقت المركب.

7.3 مقارنة دالة TODAY مع متغيرات نظام الماكرو (&SYSDATE)

يقع كثير من الإحصائيين في فخ المفاضلة غير الدقيقة بين دالة TODAY() ومتغير النظام الماكروي الشهير &SYSDATE (أو نسخته الموسعة &SYSDATE9). يكمن الفرق الجوهري في توقيت وطبيعة التقييم البرمجي لكل منهما؛ فمتغير &SYSDATE هو متغير نصي ثابت يُنشأ مرة واحدة بواسطة معالج الماكرو (Macro Processor) عند بداية تهيئة جلسة عمل SAS وتشغيلها، وتظل قيمته ثابتة كنص أبجدي رقمي لا يتغير طوال فترة استمرار الجلسة، حتى لو استمرت الجلسة تعمل لأيام متواصلة في الخوادم الكبيرة.

في المقابل، تمثل دالة TODAY() دالة تنفيذية حية (Dynamic Execution Function) يجري تقييمها في كل مرة يُنفذ فيها سطر البيانات أو خطوة المعالجة أثناء مرحلة التنفيذ (Execution Phase). يترتب على ذلك أنه إذا استمر تشغيل خط أنابيب المعالجة عبر منتصف الليل (عابراً إلى يوم تقويمي جديد)، فإن دالة TODAY() ستسترجع التاريخ الجديد بدقة متناهية، بينما سيظل متغير &SYSDATE محتفظاً بتاريخ الأمس الذي بدأت فيه الجلسة، مما قد يسبب أخطاء فادحة في معالجة البيانات وتصنيف السجلات الزمنية الدقيقة ما لم يتم الانتباه لهذا التمييز الجوهري.

8. استخدام دالة TODAY في بيئة ماكرو SAS وأتمتة التقارير

8.1 استدعاء دالة TODAY داخل لغة الماكرو عبر %SYSFUNC

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

تتم صياغة استدعاء دالة TODAY المنسقة داخل بيئة الماكرو وفق النموذج التالي:

%LET current_day = %SYSFUNC(TODAY(), WORDDATE.);
%LET file_stamp = %SYSFUNC(TODAY(), YYMMDDN8.);
%PUT Report generated on: &current_day;
%PUT File system timestamp: &file_stamp;

تُظهر هذه الشيفرة قدرة %SYSFUNC الفائقة على قبول معاملين؛ الأول هو اسم الدالة المطلوب تنفيذها خالية من الأقواس المعتادة TODAY()، والثاني هو التنسيق المطلوب تطبيقه مباشرة على الناتج قبل تحويله إلى قيمة نصية ماكروية. في هذا المثال، ينتج عن التنسيق WORDDATE. اسم التاريخ كاملاً بالأحرف (مثل: May 15, 2023)، في حين يولد التنسيق YYMMDDN8. صيغة رقمية متراصة دون فواصل (مثل: 20230515)، وهي أدوات غاية في الأهمية لتنظيم تدفق التقارير والأوامر الأوتوماتيكية.

8.2 أتمتة عناوين التقارير والجداول الزمنية بمرونة

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

يوضح الكود التالي كيفية إنشاء تقرير تحليلي مؤتمت يعكس تاريخ التنفيذ الفعلي في العنوان الرئيسي للوثيقة المنشورة:

%LET report_date = %SYSFUNC(TODAY(), DDMMYY10.);

TITLE1 "مركز التحليلات الإحصائية والأبحاث الحيوية";
TITLE2 "تقرير الأداء والمتابعة السريرية - تاريخ الاستخراج: &report_date";
FOOTNOTE "سري ومخصص للاستخدام الداخلي فقط - تم إنشاؤه آلياً بواسطة SAS Studio";

PROC MEANS DATA=work.clinical_metrics MEAN STD MIN MAX MAXDEC=2;
    VAR systolic_bp diastolic_bp cholesterol;
RUN;

TITLE;
FOOTNOTE;

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

8.3 توليد أسماء ملفات ديناميكية ومؤرخة تلقائياً

تتكامل وظيفة %SYSFUNC(TODAY(), ...) مع نظام إدارة المخرجات المتقدم (ODS – Output Delivery System) وأوامر تصدير البيانات (PROC EXPORT) لتوليد مسارات تخزين وحفظ مؤرخة تلقائياً للملفات بصيغ متعددة مثل PDF وExcel وCSV. يسهم هذا التكامل المنهجي في منع حوادث الكتابة فوق الملفات السابقة (Overwriting)، ويتيح بناء مستودع تراكمي منظم للتقارير والبيانات الإحصائية التاريخية.

يوضح النموذج التالي كيفية أتمتة مسار تصدير جدول إحصائي إلى ملف إكسل يحمل تاريخ اليوم الحالي ضمن اسمه:

%LET datestamp = %SYSFUNC(TODAY(), YYMMDDN8.);
%LET export_path = /sas_data/exports/Statistical_Summary_&datestamp..xlsx;

ODS EXCEL FILE="&export_path" OPTIONS(SHEET_NAME="Daily Metrics");
PROC PRINT DATA=work.summary_table NOOBS;
RUN;
ODS EXCEL CLOSE;

في هذه الشيفرة، يُنتج المتغير الماكروي &datestamp نصاً رقمياً موحداً (مثل: 20230515)، وتُستخدم النقطة المزدوجة (&datestamp..xlsx) لإعلام معالج الماكرو بأن النقطة الأولى هي نهاية اسم المتغير الماكروي، بينما النقطة الثانية هي الامتداد الفعلي للملف. يؤدي تنفيذ هذا الأمر تلقائياً إلى حفظ ملف فريد يومياً في المجلد المستهدف (مثل: Statistical_Summary_20230515.xlsx)، مما يسهل عمليات الفهرسة الآلية للأنظمة المؤتمتة وأرشفة سجلات الأبحاث العلمية دون تداخل.

9. الأخطاء الشائعة واستراتيجيات استكشاف الأخطاء وإصلاحها

9.1 أخطاء التنسيق والخلط بين المتغيرات العددية والنصية

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

تتسبب هذه الممارسة الخاطئة في إصدار تحذير حرج في سجل SAS يفيد بحدوث تحويل ضمني من رقم إلى نص (NOTE: Numeric values have been converted to character values)، وهو ما يقود إلى نتائج غير متوقعة تماماً؛ لأن دالة SUBSTR ستُطبق على الرقم المخزن الأصلي (مثل 23135) وليس على الشكل المقروء (مثل 15/05/2023). لتفادي هذا الانزلاق البرمجي، يجب استخراج العناصر الزمنية عبر الدوال المخصصة للتواريخ مباشرة، مثل: current_year = YEAR(TODAY()); وcurrent_month = MONTH(TODAY());، أو استخدام دالة PUT صراحة إذا كان الهدف الأساسي هو تحويل التاريخ إلى متغير نصي أصيل ومستقل في جدول البيانات: date_char = PUT(TODAY(), DDMMYY10.);.

9.2 مشاكل التوقيت وتحديث البيانات عبر الخوادم والمناطق الزمنية

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

تتطلب معالجة هذا الخلل في الأنظمة متعددة المواقع تبني استراتيجيات معايرة زمنية دقيقة؛ إما عبر توحيد التوقيت القياسي العالمي (UTC) كمرجع موحد لكافة العمليات الإحصائية داخل المؤسسة، أو من خلال تعديل القيمة اللحظية المسترجعة يدوياً بإضافة أو طرح ساعات الفرق الزمني باستخدام دالة DATETIME مع دالة الإزاحة الزمنية TZREF، ثم استخراج التاريخ الصحيح محلياً عبر دالة DATEPART()، مما يضمن اتساق البيانات التحليلية وتطابقها التام مع التوقيت الميداني للدراسة.

9.3 أخطاء منطقية عند دمج البيانات ومقارنة التواريخ

تحدث أخطاء منطقية جسيمة عند محاولة دمج جداول بيانات (Merging/Joining) أو مقارنة قيم تواريخ تم استخراجها بطرق غير متسقة عبر استخدام دالة TODAY. ومن أبرز تلك الأخطاء محاولة مقارنة تاريخ منشأ بدالة TODAY مع تاريخ آخر تم حفظه في جدول مستورد من بيئة خارجية (مثل SQL Server أو Excel) كمتغير نصي صريح (Character Date)، حيث لا تصدر لغة SAS خطأً توقفياً في بعض عمليات الدمج بالاستعلام، بل تفشل المقارنة المنطقية كلياً بسبب اختلاف نوع البيانات الداخلي في المتجهين.

كذلك تبرز معضلة القيم المفقودة (Missing Values) في المتغيرات المقارنة؛ ففي لغة SAS، تُعامل القيمة المفقودة العادية كقيمة عددية سالبة لا متناهية الصغر (تمثل بنقطة .). وإذا كتب المبرمج شرطاً مثل: IF admission_date < TODAY() THEN ...، فإن جميع السجلات التي تحتوي على تاريخ منوم مفقود (Missing) ستدخل في نطاق هذا الشرط كقيمة صحيحة منطقياً، لأن القيمة المفقودة رياضياً أصغر بكثير من أي رقم صحيح ناتج عن دالة TODAY. لتلافي هذا الخلل المنطقي القاتل، يجب كتابة الشروط الدفاعية الصارمة: IF NOT MISSING(admission_date) AND admission_date < TODAY() THEN ... لضمان استبعاد القيم التالفة من المعالجة التحليلية.

10. أفضل الممارسات البرمجية وتطبيقات عملية في تحليل البيانات

10.1 تحسين كفاءة المعالجة في قواعد البيانات الكبيرة

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

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

10.2 معايير كتابة الشيفرات القابلة لإعادة الاستخدام والصيانة

تقتضي معايير التطوير البرمجي الاحترافي في بيئة SAS كتابة أكواد واضحة، قابلة للقراءة وإعادة الاستخدام من قِبل فرق العمل الإحصائية المتعددة (Code Reusability and Maintainability). يتطلب هذا الالتزام توثيق كافة العمليات التي تعتمد على التواريخ التلقائية الناتجة عن دالة TODAY بكتل توضيحية من التعليقات البرمجية الصريحة، توضح الهدف التحليلي من الاعتماد على التاريخ اللحظي وتفاصيل التنسيقات المستخدمة.

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

10.3 دراسة حالة تطبيقية: بناء خط أنابيب متكامل لمعالجة بيانات دورية

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

تتضمن الشيفرة الكاملة لهذا الأنبوب المعالجات التالية:

/* تهيئة بيئة الماكرو واستدعاء تاريخ اليوم */
%LET today_numeric = %SYSFUNC(TODAY());
%LET today_string = %SYSFUNC(TODAY(), WORDDATE.);

/* محاكاة جدول البيانات السريرية الخام */
DATA work.clinical_cohort;
    INFILE DATALINES DELIMITER=',';
    INPUT patient_id $ admission_date : DDMMYY10. baseline_glucose;
    DATALINES;
PT001, 12/01/2023, 110
PT002, 05/03/2023, 145
PT003, 20/04/2023, 98
PT004, 01/01/2022, 160
PT005, 15/05/2023, 115
;
RUN;

/* خطوة المعالجة المركزية والتتبع الديناميكي */
DATA work.cohort_processed;
    SET work.clinical_cohort;
    
    /* استدعاء تاريخ اليوم وتنسيقه */
    evaluation_date = TODAY();
    FORMAT admission_date evaluation_date DDMMYY10.;
    
    /* العمليات الحسابية الزمنية */
    days_under_monitoring = evaluation_date - admission_date;
    monitoring_months = INTCK('MONTH', admission_date, evaluation_date);
    
    /* التصنيف المنطقي للأتراب */
    IF days_under_monitoring > 180 THEN status = "Long-Term Monitoring ";
    ELSE status = "Recent Enrollment ";
RUN;

/* استخراج وطباعة التقرير الإحصائي المؤتمت */
TITLE1 "برنامج الرقابة الطبية الحيوية المستمرة";
TITLE2 "تقرير المتابعة الصادر بتاريخ: &today_string";

PROC PRINT DATA=work.cohort_processed NOOBS;
    VAR patient_id admission_date evaluation_date days_under_monitoring monitoring_months status baseline_glucose;
RUN;

PROC MEANS DATA=work.cohort_processed MEAN MEDIAN MIN MAX MAXDEC=1;
    CLASS status;
    VAR days_under_monitoring baseline_glucose;
RUN;

TITLE;

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

خاتمة

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

إن الاستخدام الاحترافي لهذه الدالة، مقترناً بالتنسيقات القياسية مثل DDMMYY10. وDATE9. والوظائف الحسابية المتقدمة مثل YRDIF وINTCK، يمكّن المؤسسات البحثية والطبية والمالية من أتمتة التقارير الإحصائية بكفاءة لا متناهية، والتخلص التام من الأخطاء الناجمة عن التدخل البشري المستمر لتعديل المعاملات الزمنية. ومع الالتزام بأفضل الممارسات البرمجية وتفادي الأخطاء الشائعة المتعلقة بالتحويلات النصية والمناطق الزمنية، تظل دالة TODAY عنصراً لا غنى عنه في بناء تحليلات إحصائية متينة وموثوقة تواكب أعلى معايير الجودة والنزاهة في العلوم والبحوث التطبيقية المعاصرة.

المراجع

  • Barr, A. J., Goodnight, J. H., Sall, J. P., & Helwig, J. T. (1976). A user’s guide to SAS 76. SAS Institute Inc.
  • Delwiche, L. D., & Slaughter, S. J. (2019). The little SAS book: A primer (6th ed.). SAS Institute Inc.
  • International Organization for Standardization. (2019). Data elements and interchange formats – Information interchange – Representation of dates and times (ISO Standard No. 8601-1:2019). https://www.iso.org/standard/70907.html
  • SAS Institute Inc. (2020). SAS(R) 9.4 Functions and CALL Routines: Reference (5th ed.). SAS Institute Inc. https://documentation.sas.com/
  • SAS Institute Inc. (2021). SAS(R) 9.4 Macro Language: Reference (6th ed.). SAS Institute Inc. https://documentation.sas.com/
★

تقييم هذا المحتوى

5.0 / 5 • 7 تقييمات

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

looti, M. (2026, أكتوبر 20). كيفية استخدام دالة TODAY في SAS (مع أمثلة). عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-use-today-function-in-sas-with-examples/
looti, Mohammed. “كيفية استخدام دالة TODAY في SAS (مع أمثلة).” عرب سايكلوجي, 20 أكتوبر 2026, https://arabpsychology.com/statistics/how-to-use-today-function-in-sas-with-examples/.
looti, Mohammed. “كيفية استخدام دالة TODAY في SAS (مع أمثلة).” عرب سايكلوجي. أكتوبر 20, 2026. https://arabpsychology.com/statistics/how-to-use-today-function-in-sas-with-examples/.