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

יום שלישי, אוגוסט 14, 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.. איך נדע אם יש סוף שבוע באמצע או...
אין תגובות

שימוש בפונקציה DateAdd בסופי חודשים

יום רביעי, מאי 30, 2012

הפונקציה DateAdd מאפשרת לנו להוסיף או להחסיר פרקי זמן מתאריך נתון- החל מאלפיות שנייה וכלה בשנים. בדרך כלל ההתנהגות של הפונקציה צפויה והגיונית, אלא אם כן מדובר בתוספת של חודשים / רבעונים / שנים לתאריכים שנמצאים בסוף חודש או בסמוך אליו. במה דברים אמורים? נניח שנוסיף חודש לתאריך 30/04/2012, לאיזה תאריך נגיע- ל-30/05/2012 או ל-31/05/2012? לחילופין- אם נוסיף חודש לתאריך 31/05/2012 – נגיע ל-30/06/2012 או ל-01/07/2012? נבדוק מספר מקרי קצה בעייתיים: If Object_ID('tempdb..#T','U') Is Not Null Drop Table #T; ...
אין תגובות

קיבוץ תאריכים לפי ימים ושעות

יום שלישי, מאי 22, 2012

נתונה טבלת לוג של פעולות ואנחנו מעוניינים לקבל סיכומים ברמה של ימים וחלקי ימים (למשל- שעות שלמות, אך לא רק). הכיצד? (אני מניח שבכל שורה יש תאריך אירוע הכולל גם שעה, דקה וכו') נתחיל מחילוץ התאריך השלם- מגרסת 2008 ניתן להפוך את התאריך ל-Date שזה סוג הנתון המתאים למקרה זה; ואילו חובבי הנוסטלגיה הנשארים נאמנים לגרסאות קודמות יבדקו כמה ימים חלפו מתחילת הספירה (למניין מיקרוסופט) ויהפכו את זה לתאריך: Select create_date, Cast(create_date As Date) , ...
אין תגובות

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

יום שלישי, יולי 12, 2011

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

כמה ימים יש בחודש נתון?

יום רביעי, יולי 28, 2010

במחשבה ראשונה- מוצאים את ההפרש בימים בין יום כלשהו באותו חודש והיום בחודש הבא. למשל- בין 28/07/2010 ל-28/08/2010 יש 31 ימים: Select DATEDIFF(D,'20100728',DATEADD(M,1,'20100728')); הבעייה היא שאם השיטה הזו תופעל על 31/08/2010 נקבל 30 ימים באוגוסט מכיוון שהמערכת תחשב את ההפרש בין 31/08/2010 ו-30/09/2010: Select DATEDIFF(D,'20100831',DATEADD(M,1,'20100831')); במחשבה שניה- נבצע את החישוב על ה-1 בחודש, כלומר- מ-28/07/2010 נפחית 27 ימים כדי להגיע ל-1 בחודש, לזה נוסיף חודש, ונמצא את ההפרש: Select DATEDIFF(D,DATEADD(D,1-DatePart(D,'20100728'),'20100728'),DateAdd(M,1,DATEADD(D,1-DatePart(D,'20100728'),'20100728'))); נכון אך מעט מסורבל: גם ארוך וגם התאריך מצוטט ארבע פעמים! במחשבה שלישית- נגיע ל-1 בחודש על ידי הוספת מספר החודשים מאז "בריאת העולם" ל-0, באופן דומה נגיע...
אין תגובות