› פורומים › אפיון ופיתוח פריוריטי › חישוב ימי עבודה בפועל
- This topic has 22 תגובות, 2 משתתפים, and was last updated לפני 8 שנים, 2 חודשים by
אלמוני.
- Post
-
- ינואר 29, 2017 בשעה 7:09 pm
שלום,אני מעוניין לכתוב שאילתא שמציגה חישוב של מספר ימי עבודה מתאריך עד תאריך
עמודה אחת מציגה תאריך כניסה
עמודה שנייה מציגה תאריך יציאההחישוב אמור להיות כך שאם בין שני התאריכים קיימים ימים שהם שישי ושבת הספירה לא תכלול אותם.
לדוגמא : כניסה 01/01/17 יום א' יציאה 10/01/17 יום ג'
סה"כ ימים מתאריך עד תאריך 10 ימים ,
מתוכם שישי שבת – מופיע פעם אחת
סה"כ ימי עבודה בפועל 8 ימיםמהי הדרך הנכונה לחשב זאת?
האם באמצעות קרסור שלוקח את התאריך הראשון ומקפיץ בכל פעם ביום אחד ואם אותו יום הוא לא 6 או 7 אז הוא סופר אותו לתוך משתנה?האם באמצעות קרסור לבדוק מול טבלה שמחזיקה את כל ימות השנה שהם שישי שבת או אפילו חגים ואם התאריך מופיע בטבלה אז הוא לא נספר?
כיצד הייתם כותבים שאילתא שכזו?
- Replies
-
- פברואר 21, 2017 בשעה 8:29 pm
- פברואר 21, 2017 בשעה 8:33 pm
לא, זה דווקא הקטע.רשימת הימים משרת את הדו"ח באופן כללי. בגלל זה יש להכין רשימת ימי עבודה מהיום הראשון שבדו"ח עד ליום האחרון שיש בדו"ח. זאת המטרה של שלב 1 שכתבתי. שלב 2 מכין סט של כל ימי העבודה בטווח זה. מצליבים את זה אם רשימת הטווחים כשהחיתוך דואג להביא לכל טווח את הימים שיש בסט שהם בתוך הטווח הספציפי הזה, ואז מקבצים לשורה לטווח עם ספירה שזה יביא את מספר הימים שיש בסט ימי עבודה שקשורים לטווח התאריכים.
מקווה שתבין כבר. אם לא, אולי אכין דוגמה (אולי בתור קוד) מאוחר יותר הערב.
[ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]- פברואר 22, 2017 בשעה 11:01 am
אכן כך.
מספר ימי עבודה שווה להפרש בין שני התאריכים (חיסור פשוט), פחות 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אולי בהפרשים אין משמעות, אבל ה"עלות" של השיטה הפשוטה יחסית למספר הימים, בעוד ה"עלות" של שיטת החיסור קבועה.
- פברואר 22, 2017 בשעה 1:25 pm
אני מסתייג קצת1. מה עם טווח התאריכים מתחיל בשבת או מסתיים בשישי?
2. טווח תאריכים שחוצה משנה אחת לאחרת יוצרת מורכבות
3. לא נותן מענה לחגים שכן הוזכרו בשאלה המקוריתאני מודה לעניין של מספר ה-INSERT. אפשר לחסוך (אני חושב שציינתי את זה בעבר) ע"י שמירת הימים בהם לא עובדים והחסרה מחישוב מספר הימים ברוטו בטווח התאריכים.
אופיר בבקשה לעדכן אותנו אם אתה צריך דוגמאות מפורטות יותר ושל איזו שיטה. הן לוקחות זמן ולכן אם אתה תסתדר על בסיס מה שכבר נכתב חבל שנשקיע בזמן במה שלא צריך.
[ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]- פברואר 22, 2017 בשעה 1:56 pm
תודה על תשובתכםהאמת שאני עדיין מנסה להבין את מה שכתבתם… 🙂
אם תוכל להראות בדוגמא מפורטת יותר זה יוכל לעזור.
כמובן שהרעיון הכללי הוא לבדוק תאריך מסוים האם הוא קיים ברשימת התאריכים שהם לא "ימי עבודה"
הגישה שלי – להחזיק טבלה של ימי שישי + שבת + חגים למשל מהיום ו 10 שנים קדימה.. (באמצעות לוח שנה פשוט)
העניין הוא שנראה לי שלרוץ על 1000 תעודות למשל שלכל תעודה יש 3 – 20 תאריכים שצריך לבדוק יכול להיות כבד- פברואר 22, 2017 בשעה 2:43 pm
דוגמה תהיה רק הערב בע"ה
נראה לי שאתה חושב בקו שלי
את ימי שישי ושבת אפשר להכין לפי הצורך או לשמור טבלה מוכנה
אם עובדים אם טבלה מוכנה הייתי חושב שכדאי לבדוק ולעדכן אותו בכל הרצה – כדי לדאוג שתמיד טווח התאריכים הנדרש קיים שם. את החגים תנהל ידנית
חשבתי שאולי אפשר לנהל את כל זה באופן אוטומטי:
הרי מדובר רק בתאריכי עבר?
האם יש תעודה כלשהי שרושמים על כל יום שהוא יום עבודה? (ולא באף יום שלא יום עבודה)
אם כן היה אפשר לנצל את זה כמקום לימי עבודה (ב- SELECT DISTINCT על התאריכים)אוסיף כאן דבר שזכרתי לגבי בספירת התאריכים השונים – אם עושים COUNT ליד כל טווח תאריכים ויש outer join (סימן שאלה) ואין כלום ב-join אז נקבל בכל מקרה שורה אחת ב-count. עדיף ביטוי שמביא 1 אם התאריך לא אפס ולסכם. בע"ה אזכור לשים את זה בדוגמה.
[ בבקשה לא לשלוח הודעות פרטיות במערכת - אני לא קורא אותן ]- פברואר 22, 2017 בשעה 5:15 pm
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;
הווה אומר, לא יתווסף יום אם התאריך הנדבק נמצא בטבלת החגים.
- יש להתחבר למערכת על מנת להגיב.