כמה ימי ראשון יש בתקופה זמן נתונה?

12/07/2011

אין תגובות

איתי בנימין כתב פוסט עם הצעה לפתרון שמתבססת על שימוש בטבלת מספרים שמתייחסים אליהם כאל התאריכים בין ההתחלה והסיום של התקופה, ובעזרת Group By מבצעים Count על ימי ראשון אותם ניתן לזהות בעזרת פונקצית תאריך מתאימה.

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

כעקרון התאריכים ב-SQL Server הם מספרים שלמים, כאשר ההתחלה היא ב-01/01/1900 שהוא יום מספר 0 וחל במקרה ביום שני:

Select  Cast(Cast('19000101' As DateTime) As Int) [Mispar],

        DatePart(Weekday,'19000101') [Weekday],

        DatePart(Weekday,GetDate()) [Today];

clip_image002

אני אנצל את זה כדי לחשב כמה ימי ראשון היו מתחילת הספירה ועד לתאריך הפתיחה (לא כולל!),

כמה ימי ראשון היו מתחילת הספירה ועד לתאריך הסיום (כולל!),

וההפרש הוא התוצאה המבוקשת.

מכיוון שהשבוע הראשון לספירה התחיל בדיוק למחרת יום ראשון (כלומר ביום שני) – מספר השבועות השלמים עד לתאריך הפתיחה הוא מספר ימי ראשון.

לגבי תאריך הסיום יש להוסיף לו 1 כדי לכלול את היום האחרון.

למשל- מספר ימי ראשון בחודש יולי 2011:

Declare @FromDate DateTime,

        @ToDate DateTime;

Select  @FromDate='20110701',

        @ToDate='20110731';

Declare @WeekDay Int;

Select (Cast(@ToDate As Int)+1)/7-(Cast(@FromDate As Int)+0)/7 [Saturdays];

clip_image004

אם רוצים פתרון כללי לכל יום כרצוננו, נעשה זאת כך (למשל- מספר ימי רביעי בשנת 2011):

Declare @FromDate DateTime,

        @ToDate DateTime;

Select  @FromDate='20110101',

        @ToDate='20111231';

Declare @WeekDay Int;

Select  @WeekDay=4;

Select (Cast(@ToDate As Int)+2-@WeekDay)/7-(Cast(@FromDate As Int)+1-@WeekDay)/7 [Weekdays];

clip_image006

ומה יקרה אם נרצה לדעת כמה ימי חמסין יהיו באוגוסט הוא חודש הרחמים (הצילו!!!)?

בשביל זה יש פונקציה מובנית ב-SQL Server:

Declare @FromDate DateTime,

        @ToDate DateTime;

Select  @FromDate='20110801',

        @ToDate='20110831';

Select DateDiff(Day,@FromDate,@ToDate)+1 [Hamsin];

clip_image008

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

כתיבת תגובה

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