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

28/07/2010

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

Filed under: Uncategorized — תגיות: , , , , — גרי רשף @ 22:02

במחשבה ראשונה- מוצאים את ההפרש בימים בין יום כלשהו באותו חודש והיום בחודש הבא.
למשל- בין 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, באופן דומה נגיע ל-1 בחודש העוקב, ונחשב את ההפרש:

Select    DateDiff(D,DateAdd(M,DateDiff(M,0,'20100728'),0),DateAdd(M,DateDiff(M,0,'20100728')+1,0));

(0 הוא ערכו של 01/01/1900 ושם מתחיל מניין הימים לפי הספירה של מיקרוסופט)

במחשבה רביעית- האם יש דרך לצטט את התאריך פעם אחת ולא פעמיים ואולי גם לקצר עוד קצת את הביטוי?

כן: נוסיף ל-0 את מספר החודשים ועוד 1 (נגיע לתחילת החודש הבא), נוריד יום ונגיע ליום האחרון בחודש המבוקש, ומספר היום הוא מספר הימים בחודש:

Select    DatePart(D,DateAdd(M,DateDiff(M,0,'20100728')+1,0)-1);

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

Select    name,

        crdate,

        DatePart(D,DateAdd(M,DateDiff(M,0,crdate)+1,0)-1)

From    sys.sysobjects;

פונקציות שנעשה בהן שימוש כאן:

DateDiff ההפרש בין שני תאריכים (בימים או בחודשים או בשניות וכו')

DatePart היום או החודש או השעה או השנה וכו' בנקודת זמן מסויימת

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

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

להגיב »

עדיין אין תגובות.

RSS feed for comments on this post. TrackBack URI

להשאיר תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s

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

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