יום שני, 11 ביולי 2011

כמה ימי ראשון יש בין שני תאריכים?

שלום רב,




שאלה:
יש לי מערכת לחישוב שעות עבודה המבוססת כמובן בסיס נתונים מסוג sql server :) .
בחברה שלנו מוגדר כי יום ראשון בשבוע הינו חצי יום עבודה ולכן על מנת לחשב שעות נוספות ליום עבודה ספציפי זה , אני צריך לחשב כמה ימי ראשון יש לי בין שני תאריכים.
כיצד ניתן לחשב ב - sql server כמה ימי ראשון לדוגמא יש לי בין שני תאריכים?




תשובה:
על מנת לחשב כמה ימי ראשון, ובכלל כמה "שמות" ימים יש לי בין שני תאריכים אני אקרא בהתחלה לפונקציות dateadd ו- datename על מנת לקבל את מספר היום -
datename(weekday,dateadd(day,number,@date1).
לאחר מכן, אני אעזר בטבלת המערכת master..spt_values אשר מכילה כ- 2500 פרמטרים על מנת לפענח את שם היום.




הפתרון הינו:




declare @date1 datetime, @date2 datetime
select
@date1='2011-07-01', @date2='2011-07-11'
select
sum(case when datename(weekday,dateadd(day,number,@date1))='sunday' then 1 else 0 end)
as sundays,
sum(case when datename(weekday,dateadd(day,number,@date1))='Monday' then 1 else 0 end)
as Monday,
sum(case when datename(weekday,dateadd(day,number,@date1))='Tuesday' then 1 else 0 end)
as Tuesday,
sum(case when datename(weekday,dateadd(day,number,@date1))='Wednesday' then 1 else 0 end)
as Wednesday,
sum(case when datename(weekday,dateadd(day,number,@date1))='Thursday' then 1 else 0 end)
as Thursday,
sum(case when datename(weekday,dateadd(day,number,@date1))='Friday' then 1 else 0 end)
as Friday,
sum(case when datename(weekday,dateadd(day,number,@date1))='Saturday' then 1 else 0 end)
as Saturday
from master..spt_values
where type='p' and dateadd(day,number,@date1)<=@date2



כמובן שאפשר עוד לייעל את השליפה. ובמידה ויש לכם רעיונות נוספים לפתרון הבעיה אשמח לשמוע!!
בהצלחה!



הוסף רשומת תגובה