בדיקה על חודש איזה אירועים קיימים בו
-
יש לי טבלת אירועים מתמשכים למשל פסח מתאריך a עד תאריך b או שבועות מתאריך c עד תאריך d עם התיאור שלהם
אני עובד בשפת פייתון
עם sqlalchemyזה המבנה של הsqlite שלי
class Event(BaseTable): __tablename__ = 'events' id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) start_date: Mapped[datetime.datetime] end_date: Mapped[datetime.datetime] description: Mapped[Optional[str]]
אני רוצה ליצור פונקציה שמקבלת חודש ושנה לועזית ותחזיר ליסט עם כל הימים שיש בהם אירועים.
למשלdef test(your: int, month: int)->list : #בדיקה מתי בדיוק חל שבועות ובאיזה תאריך לועזי זה יוצא return[26,27] test(2023,5)
איך אני יכול ליצור שאילתא כזאת?
הבעיות שלי הם-
אם התאריכים הם בתוך החודש לועזי זה קצת פחות בעיה לרוץ ולהכין את הליסט לפי ההתחלה והסוף של האירועים, כי עשיתי תנאי האם זה גדול מהתאריך הראשון בחודש && קטן מסוף החודש, ככה אני ״לכדתי״ את האירוע והכנתי ליסט.
-
התחלתי להסתבך אם זה אירוע שנמשך על פני התחלה של חודש לועזי , למשל הוא התחיל ב 28 לחודש ונמשך עד ה 5 לחודש הבא לא הצלחתי לשלוף את זה נורמלי כי בעצם הוא לא קלט את האירוע כיוון שהוא התחיל אחרי התאריך התחלה שהגדרתי בחיפוש.
-
חשבתי פשוט לשמור בשדה במסד נתונים את החודשים שהוא מופיע אבל זה נראה לי ממש לא הדרך הנכונה.
-
כאן מצאתי משהו דומה https://stackoverflow.com/questions/8895208/sqlalchemy-how-to-filter-date-field אך הבעיה ששם הוא מנסה לבדוק על שדה מסויים האם הוא בטווח התאריכים , אני מחפש טווח בתוך טווח כאשר אני צריך לקבל חלק מהטווח במקרה שהוא מתנגש עם תחילת החודש.
או בניסוח מעט שונה, אני צריך לקבל את כל התאריכים שבין תאריך x ל y ואם התאריך מתחיל לפני x או נגמר אחרי y אז שיציג לי רק מתחילת הטווח של x ועד הסוף הטווח המקורי שלו
-
-
סתם טיפ (אולי כבר עמדת על זה), כדי לענות על השאלה צריך לפצל את השאלה לשני חלקים:
א) מה השאילתא הנכונה
ב) איך לתרגם את זה ל-sqlalchemyבחיפוש אחרי תשובה לשאלה הראשונה אתה לא אמור לכתוב את המילה sqlalchemy כלל בחיפוש
רק אחרי התשובה לשאלה הראשונה, אם יש עדיין שאלה איך לממש ב-sqlalchemy, אז ניתן לחפש על זה בנפרדולעצם השאלה:
בעצם צריך לחפש את האירועים שתאריך הסיום או תאריך ההתחלה נמצאים בתוך החודש הרצוי
דהיינו (פסאודו קוד):WHERE (start_date BETWEEN תחילת_החודש AND סוף_החודש) OR (end_date BETWEEN תחילת_החודש AND סוף_החודש)
https://www.sqlite.org/lang_expr.html#the_between_operator
אני לא יודע אם יש תמיכה ב-sqlalchemy לאופרטורBETWEEN
, אבל גם אם לא זה זהה לשילוב התנאים של לא פחות מ- ולא יותר מ-זה יתן לך רשימת אירועים שחופפים את החודש. איך תתרגם את זה לרשימת ימים? לכאורה כבר עדיף בקוד ולא ב-SQL. למה להסתבך...
-
@yossiz כתב בבדיקה על חודש איזה אירועים קיימים בו:
סתם טיפ (אולי כבר עמדת על זה), כדי לענות על השאלה צריך לפצל את השאלה לשני חלקים:
א) מה השאילתא הנכונה
ב) איך לתרגם את זה ל-sqlalchemyבחיפוש אחרי תשובה לשאלה הראשונה אתה לא אמור לכתוב את המילה sqlalchemy כלל בחיפוש
רק אחרי התשובה לשאלה הראשונה, אם יש עדיין שאלה איך לממש ב-sqlalchemy, אז ניתן לחפש על זה בנפרדולעצם השאלה:
בעצם צריך לחפש את האירועים שתאריך הסיום או תאריך ההתחלה נמצאים בתוך החודש הרצוי
דהיינו (פסאודו קוד):WHERE (start_date BETWEEN תחילת_החודש AND סוף_החודש) OR (end_date BETWEEN תחילת_החודש AND סוף_החודש)
https://www.sqlite.org/lang_expr.html#the_between_operator
אני לא יודע אם יש תמיכה ב-sqlalchemy לאופרטורBETWEEN
, אבל גם אם לא זה זהה לשילוב התנאים של לא פחות מ- ולא יותר מ-זה יתן לך רשימת אירועים שחופפים את החודש. איך תתרגם את זה לרשימת ימים? לכאורה כבר עדיף בקוד ולא ב-SQL. למה להסתבך...
אני לא יודע אם בכלל תכננת את זה בצורה הכי נכונה, אבל לא הקדשתי לזה מספיק מחשבה
תודה,אכן עמדתי על זה , ובחיפושים לא חיפשתי את sqlalchemy
כתבתי שאני עובד עם sqlalchemy בשביל שיהיה מובן הקטע קוד שאיתו בניתי את הטבלא.
אכן מה שכתבת פותר כמעט כליל את הבעיה. ומביאה לי גם אם מתחיל אירוע בחודש הזה, וגם אם מסתיים אירוע בחודש הזה, אחרי שיש לי את האירוע אני יודע להוציא ממנו את הימים של אותו חודש בלי החודש הלא רלוונטי.הבעיה מסתבכת כשלמשל חודש 3-4-5 מלא באירוע אחד מתמשך, אני לא יקבל בחודש 4 שום מידע על אירוע, כיוון שהוא לא התחיל בחודש 4 ולא הסתיים בחודש 4
עריכה:
בס״ד לאחר קריאה של הפוסט המחכים לעייל וחשיבה שוב אני חושב שזאת הדרך שצריך לעשות, אני עכשיו בודק, אעדכן.שאילתא 1
תחילת תור 1 גדול מתחילת תור קיים && סוף תור 1 קטן מסוף תור קיים
שאילתא 2
תחילת תור 1 גדול מתחילת תור קיים אבל קטן מסוף תור קיים
שאילתא 3
סוף תור 1 גדול מתחילת תור קיים אבל קטן מסוף תור קיים
שאילתא 4
תחילת תור 1 קטן מתחילת תור קיים && סוף תור 1 גדול מסוף תור קיים -
@צבי-ש כתב בבדיקה על חודש איזה אירועים קיימים בו:
הבעיה מסתבכת כשלמשל חודש 3-4-5 מלא באירוע אחד מתמשך, אני לא יקבל בחודש 4 שום מידע על אירוע, כיוון שהוא לא התחיל בחודש 4 ולא הסתיים בחודש 4
אכן לא חשבתי על זה
אבל עכשיו שאני מתיישב שוב בדבר אני רואה שאפשר בתנאי פשוט:
סוף האירוע אחרי תחילת החודש ותחילת האירוע לפני סוף החודש -
@dovid כתב בבדיקה על חודש איזה אירועים קיימים בו:
כיון שכבר כותבים טבלה, אני מציע לכתוב את כל הימים כולם.
זה לא יוצא הרבה יותר שורות.אני מעדיף לעשות את זה כן עם תאריך התחלה וסיום ולא טבלא עם ימים,
- זה פחות שורות כי רב האירועים שלי יהיו למשך שבוע
- אם אני ירצה להפוך את זה לאופציה גם לשעות אני פשוט צריך להוסיף בתצוגה אופציה לבחור גם שעות, כי המסד נתונים כבר מוכן גם לשעות כי הוא בכל מקרה משווה מול יוניקס