BookmarkSubscribeRSS Feed
Hagay
SAS Employee

שבוע שעבר דיברנו על הפונקציה INTNX שהיא אחת משתי הפונקציות השימושיות ביותר בעיבוד תאריכים ב – SAS. הפונקציה השנייה, עם שם מוזר לא פחות, היא INTCK. המטרה של הפונקציה היא חישוב מספר התקופות בין שתי נקודות בזמן.

גם הפונקציה הזו יכולה לקבל ארבעה פרמטרים אבל לרוב נסתפק בשלושה. הראשון הוא יחידת הזמן שאנחנו רוצים לספור כמה כאלו נכנסות בין שתי התקופות שלנו, הפרמטר השני הוא משתנה הזמן המוקדם יותר והפרמטר השלישי הוא משתנה הזמן המאוחר יותר. נראה לי שהגיע הזמן לכמה דוגמאות:

data _null_;	
	d1="20sep2018"d;
	d2="05oct2019"d;
	d_1=intck('month', d1, d2);
	d_2=intck('year.10', d1, d2); * Number of years where a year starts on October;
	d_3=intck('week.6', d1, d2); * Number of weeks that starts on Friday;
	put d_1= d_2= d_3=;
	t1="15:14"t;
	t2="21:43"t;
	t_1=intck('hour', t1, t2);
	t_2=intck('minute30', t1, t2); * Number of 30 minutes periods;
	put t_1= t_2=;
	dt1="20feb2018:12:34:09"dt;
	dt2="04oct2018:10:22:32"dt;
	dt_1=intck('dtmonth', dt1, dt2);
	dt_2=intck('hour', dt1, dt2);
	put dt_1= dt_2=;
run;

הפרמטר הראשון של הפונקציה המציין את יחידת הזמן אותה אנחנו סופרים מאפשר לנו גם להוסיף שני מספרים נוספים להתאמה מדויקת יותר שלו. הוספה של מספר בצמוד לשם יחידת הזמן מציין מקדם ההכפלה של יחידת הזמן. כלומר יחידת זמן month2 מאפשרת לנו לחשב כמה תקופות של חודשיים יש בין שני התאריכים שלנו ו – minute30 זה תקופות של חצי שעה.

נקודה עשרונית עם מספר מימין לה מאפשר לנו להזיז את יחידת הזמן שלנו במספר של יחידות זמן מוכלות. לדוגמא week.6 מציין שבועות כאשר כל שבוע מתחיל ביום שישי ואילו year.10 מציין שנים שכל שנה מתחילה באוקטובר. לצערנו SAS לא מאפשרת לנו להתפרע יותר מידי עם ההזזות ויש מקרים שלא יעבדו כמו למשל month.7 שנראה הגיוני שיאפשר לנו לחשב כמה חודשים עברו בין תאריכים כאשר כל חודש מתחיל ב – 7 לחודש אבל SAS מודיעה לנו שהגזמנו.

 

הפרמטר הרביעי הוא קצת מבלבל אבל מאוד שימושי כשצריך. בברירת המחדל הפונקציה INTCK מחזירה לנו את מספר הגבולות של תקופות. לדוגמא, אם הפרמטר הראשון הוא year, INTCK תחזיר לנו כמה פעמים אנחנו חוצים את הראשון לינואר בין שני התאריכים שהעברנו לה כפרמטר השני והשלישי ולא את מספר השנים השלמות בין שני התאריכים הללו. אם אנחנו כן רוצים לחשב את מספר השנים השלמות, למשל לחישוב גיל של אדם, אז נעביר כפרמטר רביעי את המחרוזת "CONTINUOUS" או רק "CONT" או אפילו רק "C" כדי לשנות את אופי החישוב של INTCK:

data _null_;
	d1="22aug2000"d;
	d2="20aug2010"d;
	diff_d=intck('year', d1, d2);
	diff_c=intck('year', d1, d2, 'c');
	put diff_d= diff_c=;
run;

 

כמו תמיד, לסיום שתי נקודות נוספות למחשבה.

הראשונה היא שלפעמים אנחנו צריכים להוסיף 1 לתוצאת החישוב של הפונקציה INTCK. לדוגמא, אם אנחנו רוצים לחשב פער בימים בין שני תאריכים והפרמטר השני שווה לפרמטר השלישי הפונקציה תחזיר לנו 0 אבל אם אנחנו מחשבים, למשל, את כמות הימים שמנוי היה חבר בשירות שלנו אז אנחנו היינו מצפים לקבל דווקא במקרה הזה 1 – כלומר יום אחד:

data _null_;
	Rosh_Hashana="19sep2020"d;
	Yom_Kipoor="28sep2020"d;
	Tshuva_Days=intck('day', Rosh_Hashana, Yom_Kipoor)+1;
	put Rosh_Hashana= hebdate.; * Use Hebrew SAS;
	put Yom_Kipoor= hebdate.;
	put Tshuva_Days=;
run;

נקודה שניה היא פונקציה קצת יותר אקזוטית בשם DATDIF. גם הפונקציה הזאת מאפשרת לנו לחשב פער בימים בין שני משתני תאריך (תאריך בלבד, לא זמן ולא תאריך-שעה) אבל הפרמטר השלישי שלה מאפשר לנו לשלוט על שיטת החישוב. למשל ערך של 30/360 מתייחס לכל חודש בשנה כבעל 30 ימים בדיוק ללא קשר לכמות הימים בפועל באותו חודש. חישוב זה נפוץ בחישובי ריבית ובחישוב התקופה עבור דמי מנוי לחודש חלקי (למשל עבור חבילת הסלולר):

data _null_;
	d1="15feb2019"d;
	d2="14mar2019"d;
	d3="15dec2019"d;
	d4="14jan2020"d;
	d_1=datdif(d1, d2, '30/360')+1;
	d_2=datdif(d3, d4, '30/360')+1;
	put d_1=;
	put d_2=;
run;

גמר חתימה טובה,

חגי