חישוב ימי עבודה בפועל

פורומים אפיון ופיתוח פריוריטי חישוב ימי עבודה בפועל

  • Post
    ofir
    משתתף
    שלום,

    אני מעוניין לכתוב שאילתא שמציגה חישוב של מספר ימי עבודה מתאריך עד תאריך
    עמודה אחת מציגה תאריך כניסה
    עמודה שנייה מציגה תאריך יציאה

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

    לדוגמא : כניסה 01/01/17 יום א' יציאה 10/01/17 יום ג'
    סה"כ ימים מתאריך עד תאריך 10 ימים ,
    מתוכם שישי שבת – מופיע פעם אחת
    סה"כ ימי עבודה בפועל 8 ימים

    מהי הדרך הנכונה לחשב זאת?
    האם באמצעות קרסור שלוקח את התאריך הראשון ומקפיץ בכל פעם ביום אחד ואם אותו יום הוא לא 6 או 7 אז הוא סופר אותו לתוך משתנה?

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

    כיצד הייתם כותבים שאילתא שכזו?

מוצגות 7 תגובות – 16 עד 22 (מתוך 22 סה״כ)
  • Replies
    yitzchok
    משתתף
    IL
    הוא מזכיר את החישוב שהוא הביא קודם כאן
      [ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]
    yitzchok
    משתתף
    IL
    לא, זה דווקא הקטע.

    רשימת הימים משרת את הדו"ח באופן כללי. בגלל זה יש להכין רשימת ימי עבודה מהיום הראשון שבדו"ח עד ליום האחרון שיש בדו"ח. זאת המטרה של שלב 1 שכתבתי. שלב 2 מכין סט של כל ימי העבודה בטווח זה. מצליבים את זה אם רשימת הטווחים כשהחיתוך דואג להביא לכל טווח את הימים שיש בסט שהם בתוך הטווח הספציפי הזה, ואז מקבצים לשורה לטווח עם ספירה שזה יביא את מספר הימים שיש בסט ימי עבודה שקשורים לטווח התאריכים.

    מקווה שתבין כבר. אם לא, אולי אכין דוגמה (אולי בתור קוד) מאוחר יותר הערב.

      [ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]
    אלמוני
    אורח
    אכן כך.
    מספר ימי עבודה שווה להפרש בין שני התאריכים (חיסור פשוט), פחות 2 כפול הפרש השבועות בין שני התאיריכים.
    למשל: 14/02 היה בשבוע 1707, ו-22/02 בשבוע 1708.
    22/02 פחות 14/02 = 8, אבל צריך להוסיף 1 כדי לקחת את תאריך היום בחשבון (מה שנקרא FENCEPOST ERROR), לכן 9
    1708 פחות 1707 = 1
    לכן מספר ימי עבודה = 9 פחות 1 * 2 = 7
    בשיטה של כיתה א':
    14/02 – 1
    15/02 – 1
    16/02 – 1
    17/02 – 0 (יום שישי)
    18/02 – 0 (שבת)
    19/02 – 1
    20/02 – 1
    21/02 – 1
    22/02 – 1
    סה"כ 7

    אולי בהפרשים אין משמעות, אבל ה"עלות" של השיטה הפשוטה יחסית למספר הימים, בעוד ה"עלות" של שיטת החיסור קבועה.

    yitzchok
    משתתף
    IL
    אני מסתייג קצת

    1. מה עם טווח התאריכים מתחיל בשבת או מסתיים בשישי?
    2. טווח תאריכים שחוצה משנה אחת לאחרת יוצרת מורכבות
    3. לא נותן מענה לחגים שכן הוזכרו בשאלה המקורית

    אני מודה לעניין של מספר ה-INSERT. אפשר לחסוך (אני חושב שציינתי את זה בעבר) ע"י שמירת הימים בהם לא עובדים והחסרה מחישוב מספר הימים ברוטו בטווח התאריכים.

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

      [ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]
    ofir
    משתתף
    תודה על תשובתכם

    האמת שאני עדיין מנסה להבין את מה שכתבתם… 🙂

    אם תוכל להראות בדוגמא מפורטת יותר זה יוכל לעזור.

    כמובן שהרעיון הכללי הוא לבדוק תאריך מסוים האם הוא קיים ברשימת התאריכים שהם לא "ימי עבודה"

    הגישה שלי – להחזיק טבלה של ימי שישי + שבת + חגים למשל מהיום ו 10 שנים קדימה.. (באמצעות לוח שנה פשוט)
    העניין הוא שנראה לי שלרוץ על 1000 תעודות למשל שלכל תעודה יש 3 – 20 תאריכים שצריך לבדוק יכול להיות כבד

    yitzchok
    משתתף
    IL
    דוגמה תהיה רק הערב בע"ה
    נראה לי שאתה חושב בקו שלי
    את ימי שישי ושבת אפשר להכין לפי הצורך או לשמור טבלה מוכנה
    אם עובדים אם טבלה מוכנה הייתי חושב שכדאי לבדוק ולעדכן אותו בכל הרצה – כדי לדאוג שתמיד טווח התאריכים הנדרש קיים שם. את החגים תנהל ידנית
    חשבתי שאולי אפשר לנהל את כל זה באופן אוטומטי:
    הרי מדובר רק בתאריכי עבר?
    האם יש תעודה כלשהי שרושמים על כל יום שהוא יום עבודה? (ולא באף יום שלא יום עבודה)
    אם כן היה אפשר לנצל את זה כמקום לימי עבודה (ב- SELECT DISTINCT על התאריכים)

    אוסיף כאן דבר שזכרתי לגבי בספירת התאריכים השונים – אם עושים COUNT ליד כל טווח תאריכים ויש outer join (סימן שאלה) ואין כלום ב-join אז נקבל בכל מקרה שורה אחת ב-count. עדיף ביטוי שמביא 1 אם התאריך לא אפס ולסכם. בע"ה אזכור לשים את זה בדוגמה.

      [ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]
    אלמוני
    אורח
    D1 = תאריך התחלה
    D2 = תאריך סיום
    לפי גרסת הלולאה …

    :D1 = :D1 - 1440;
    :DAYS = 0;
    LABEL 1;
    :D1 = :D1 + 1440;
    LOOP 1 WHERE DAY (:D1) >= 6;
    :DAYS = :DAYS + 1;
    LOOP 1 WHERE :D1 < :D2;

    מספר ימי עבודה יהיה במשתנה DAYS

    כמובן אין התמודדות עם חגים. בהנחה שיש טבלת HOLIDAYS, אז צריך להוסיף את השורה הבאה לפני שמגדילים את DAYS

    LOOP 1 FROM HOLIDAYS
    WHERE CURDATE = :D1;

    הווה אומר, לא יתווסף יום אם התאריך הנדבק נמצא בטבלת החגים.

מוצגות 7 תגובות – 16 עד 22 (מתוך 22 סה״כ)
  • יש להתחבר למערכת על מנת להגיב.