הבלוג של גרי רשף

12/07/2011

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

Filed under: Uncategorized — תגיות: , — גרי רשף @ 17:46

איתי בנימין כתב פוסט עם הצעה לפתרון שמתבססת על שימוש בטבלת מספרים שמתייחסים אליהם כאל התאריכים בין ההתחלה והסיום של התקופה, ובעזרת 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

מודעות פרסומת

תגובה אחת »

  1. סתם תגובת OFF לגבי ימי החמסין
    עד אתמול הייתי בטוח שהתשובה היא כ 60 (חודשיים של הקיץ) אבל אתמול אחרי שחזרתי מכמה שעות סידורים מחוץ למשרד הגעתי למסקנה חד משמעית שהתשובה היא כמספר הימים שנמצאים מחוץ למזגן
    שום נוסחה ב SQL לא יכולה לחשב את זה אוטומטית 🙂

    * דרך אגב הגבתי לפוסט של איתי בשלושה מקומות שונים שהוא פרסם. התגובה הראשונה היתה בפורום בתפוז… כמה דקות אחר כך בפורום במייקרוסופט ואז אצלו בפוסט…
    למה זה מעניין?!? טוב זה לא ממש מעניין אבל ניתן לראות ממש אבולוציה במחשבה 🙂 ובכל תגובה הוספתי עוד נקודה 🙂
    במייקרוספט ניתן לערוך תגובות אז בסוף הוספתי גם סיפור שנזכרתי בו לגבי חישוב הפרש של נתונים (כמו הפרש של תאריכים)

    תגובה של ronen — 13/07/2011 @ 12:30


RSS feed for comments on this post. TrackBack URI

להשאיר תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

בלוג בוורדפרס.קום.

%d בלוגרים אהבו את זה: