הוספת ימי עסקים

14/08/2012

אין תגובות

התאריך הוא 10/08/2012 ואנחנו מעוניינים לדעת מה יהיה התאריך בעוד 30 ימי עסקים.
נניח שימי העסקים הם שני-שישי כמקובל בעולם המערבי, ונתעלם מימי שבתון אחרים מלבד שבת-ראשון.
הבעייה במקרה זה פשוטה: 30 ימי עסקים הם 6 שבועות בדיוק, נוסיף 6 שבועות ליום שישי 10/08/2012 ונגיע ליום שישי 21/09/2012.
מה קורה אם רוצים להוסיף 32 ימי עסקים? הבעייה מסתבכת: יש להוסיף 32/5=6 שבועות (=> יום שישי 21/09/2012) ועוד 32%5=2 ימים, ומכיוון שמדובר ביום שישי – צריך להגיע ליום שלישי 25/09/2012 ולא ליום ראשון 23/09/2012.. איך נדע אם יש סוף שבוע באמצע או לא (מיום שני קופצים 2 ימים ליום רביעי אך מיום שישי קופצים 4 ימים ליום שני)?
ננהג איפוא כך: נחסיר מיום שישי 4 ימים ונגיע ליום שני (תחילת שבוע העבודה), ונוסיף 32+4=36 ימים.
4 ימים לפני 10/08/2012 זה יום שני 06/08/2012,
נוסיף 36/5=7 שבועות ונגיע ליום שני 24/09/2012,
ונוסיף עוד 36%5=1 ימים ונגיע ליום שלישי 25/09/2012.
איך נדע שמיום שישי יש להוריד 4 ימים? לכאורה די ברור-(..,DayPart(WeekDay של 10/08/2012 מחזיר 6, מזה מורידים 2 ומקבלים 4. לא כך?

Select DatePart(WeekDay,'20120810');

clip_image002

זה רק במקרה כך: השפה של ה-Session הפעיל שלנו מוגדרת בדרך כלל כ- us_english

Select @@Language;

clip_image004

וכמקובל בארצות דוברות אנגלית היום הראשון של השבוע הוא יום ראשון (Sunday),

אלא שבארצות אחרות – דוברות ספרדית למשל – היום הראשון של השבוע הוא יום שני שלנו (Lunes):

Set    Language Español; --Hola muchachos..

Select @@DateFirst;

 

Set    Language US_English;--Behave yourself!

Select @@DateFirst;

clip_image006

כלומר- בארצות דוברות ספרדית היום הראשון בשבוע הוא היום שמספרו המוחלט 1 (1=יום שני=Monday=Lunes)

ובארצות דוברות אנגלית היום הראשון בשבוע הוא היום שמספרו המוחלט 7 (7=יום ראשון=Sunday=Domingo).

לפיכך, על השאילתה הנ"ל עם ה-DatePart שהחזירה לנו 6=יום שישי נקבל בארגנטינה או בספרד 5 (יום שישי שלנו אך החמישי בשבוע שלהם):

Set    Language Español; --Hola muchachos..

Select DatePart(WeekDay,'20120810');

 

Set    Language US_English;--Behave yourself!

Select DatePart(WeekDay,'20120810');

clip_image008

נצטרך אם כך ל-DatePart להוסיף @@DateFirst, להוריד 2 ולמצוא שארית מ-7 כדי לדעת כמה ימים להחסיר כדי להגיע ליום שני שהוא יום העבודה הראשון בשבוע:

Set    Language Español; --Hola muchachos..

Select DatePart(WeekDay,'20120810') [DatePart],

       @@DateFirst [DateFirst],

       (DatePart(WeekDay,'20120810')+@@DateFirst-2)%7 [Substract];

 

Set    Language US_English;--Behave yourself!

Select DatePart(WeekDay,'20120810') [DatePart],

       @@DateFirst [DateFirst],

       (DatePart(WeekDay,'20120810')+@@DateFirst-2)%7 [Substract];

clip_image010

מה שנשאר זה קצת לסדר את הביטוי ולקבל לבסוף את הסמטוכה הבאה:

Declare @D Date='20120810',

        @N Int=30;

 

Select  DateAdd(Day,-DatePart(WeekDay,@D)+(9-@@DateFirst)%7+(@N+DatePart(WeekDay,@D)-(9-@@DateFirst)%7)/5*7+(@N+DatePart(WeekDay,@D)-(9-@@DateFirst)%7)%5,@D);

clip_image012

ואם יש ספק- נבדוק זאת היטב עם 30 ו-32 ימים בשתי השפות:

Declare @D Date='20120810',

        @N Int;

 

Set     Language Español; --Hola muchachos..

Set     @N=30;

Select  DateAdd(Day,-DatePart(WeekDay,@D)+(9-@@DateFirst)%7+(@N+DatePart(WeekDay,@D)-(9-@@DateFirst)%7)/5*7+(@N+DatePart(WeekDay,@D)-(9-@@DateFirst)%7)%5,@D);

Set     @N=32;

Select  DateAdd(Day,-DatePart(WeekDay,@D)+(9-@@DateFirst)%7+(@N+DatePart(WeekDay,@D)-(9-@@DateFirst)%7)/5*7+(@N+DatePart(WeekDay,@D)-(9-@@DateFirst)%7)%5,@D);

 

Set     Language US_English;--Behave yourself!

Set     @N=30;

Select  DateAdd(Day,-DatePart(WeekDay,@D)+(9-@@DateFirst)%7+(@N+DatePart(WeekDay,@D)-(9-@@DateFirst)%7)/5*7+(@N+DatePart(WeekDay,@D)-(9-@@DateFirst)%7)%5,@D);

Set     @N=32;

Select  DateAdd(Day,-DatePart(WeekDay,@D)+(9-@@DateFirst)%7+(@N+DatePart(WeekDay,@D)-(9-@@DateFirst)%7)/5*7+(@N+DatePart(WeekDay,@D)-(9-@@DateFirst)%7)%5,@D);

clip_image014

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *