none
טיפ - כמה ימי ראשון יש בין שני תאריכים? RRS feed

כל התגובות

  • הי,

    אם הבנתי נכון את השאלה אז נראה לי שגם הסקריפט המצורף נותן פתרון, הוא מבוסס על טבלת תאריכים מג'ונרתת.

    Declare @Dates table
    (
    	dtDate datetime
    )
    
    Declare @StartDT datetime 
    Set @StartDT = '2011-01-01'
    While @StartDT < '2012-01-01'
    Begin
    	Insert @Dates (dtDate) Select @StartDT
    	Set @StartDT = dateadd(dd, 1, @StartDT)
    End
    
    Select DATENAME(dw, dtDate), count(*)
    From @Dates
    Where dtDate between '2011-07-01' And '2011-07-11' 
    Group by DATENAME(dw, dtDate)
    Having DATENAME(dw, dtDate) = 'Sunday'

     


    אסף שלם
    יום שני 11 יולי 2011 14:38
  • וכמו שכבר כתבתי בתגובה בבלוג הרי שהנה עוד דרך (בלי הקוד אלא לוגיקה מלאה)

    הבדיקה שנעשתה כאן מתבססת למעשה על מעבר על כל הימים בין 2 התאריכים שהוכנסו (בסך הכל איתי עושה שימוש בטבלה של מספרים ואסף בחר בשיטה של לולאה ישירה על מנת לאפשר לקבל את כל הימים בזה אחר זה בין התאריכים שלנו)

    הרעיון יפה אבל..

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

    הנה רעיון נוסף:
    הרעיון הבא בתכנות ושימוש בלולאות בוודאות ייתן שיפור ניכר של סדרי גודל אבל ב SQL אני לא יודע כמה השיפור יראה. עדיין לא בדקתי אבל אני צופה שככל שתקופת הזמן תהיה גדולה יותר השיפור יראה ב צורה ברורה יותר.

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

    הבסיס לרעיון: נחשב שבועות בפעלת חישוב אחת במקום לספור ימים.

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

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

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

    כאמור ככל שתקופת הזמן תהיה גדולה יותר אני צופה עדיפות גבוהה יותר לשיטה זו.


    * OFF מזכיר לי מישהו שביקשו ממנו לחשב בקוד באפליקציה 1001 פחות 30 אז הוא ביצע לולאה מ30 עד 1001 וכל פעם העלה באחד וספר בצורה כזו. מכיוון שזה לקח הרבה זמן והלקוח שלו התלונן אז הוא בחר לעגל נתונים ולעבור בלולאה כל 5 ולא כל 1 אז הוא הוסיף 5 כל פעם וככה הביא ללקוח תוצאה יותר מהירה אבל עם דיוק יותר קטן.

    כמובן שאני החלפתי את החישוב בפעולת חשבון אחת של 1001 מינוס 30 וקיבלתי תוצאה מדוייקת באפס זמן הרצה

    ** המצב כאן אינו זהה כמובן וזה רק משהו שעלה לי במחשבה
    המספרים לא אמיתיים והדוגמה לא אמיתית :-)
    אבל...

    יום שני 11 יולי 2011 17:52
    מנחה דיון