03-04-11, 20:25 | # 1 |
חבר מתקדם
|
בעיה בשאילתא
קודם כל אני שונא את הכיתוב הבא- זו השגיאה:
#1547 - Column count of mysql.proc is wrong. Expected 20, found 16. The table is probably corrupted עכשיו למה : הבעיה כזו רשמתי קוד SQL לתפארת מדינת ישראל עד שרציתי לעשות שהרשומות שיוצגו יהיו תלויות ב WHERE של תאריכים. לא עבד אז קיצצתי מהשאילתא שלי עד שנשארתי עם השאילתה הפשוטה הזו.... והבעיה עדין קיימת select * from articles where sendtime between getdate()-6 and getdate() שימו לב איפה כנראה הבעיות... 1. השדה SENDTIME הוא מסוג TIMESTAMP 2. העמודה SENDTIME מכיון שהכנסתי אותה אחרי שכבר היו כתבות יש המון כתבות לפני שהכנסתי לשם תאריך שיש בהם NULL . ניסיתי להשתמש גם בפונקציה של DATEADD בשביל שליפת הכתבות מ6 הימים האחרונים אבל ללא הועיל - הבעיה נשארת . מה לפי דעתכם הגורם ומה אפשר לעשות?
__________________
- חייך הכל לטובה . |
03-04-11, 20:42 | # 2 |
מנהל פורום, עסק רשום
|
אם אתה חושב שהבעיה היא בכך שיש הרבה ערכים שהם NULL, למה שלא תתן ערך ברירת מחדל של איזשהו תאריך בעבר הרחוק? לדוגמא 2000-01-01?
למרות שמהשגיאה שאתה מקבל עושה רושם שהבעיה היא במקום אחר. שאילתות select פשוטות כמו select * from articles limit 10 עובדות? |
03-04-11, 22:55 | # 3 |
חבר מתקדם
|
כן זה עובד ברגע שאני מוחק את בדיקה של התאריך העניין הוא שאתם באמת חושבים שזו הבעיה או שאולי אי אפשר לבצע את ההשוואות של BETWEEN או DATEADD על TIMESTAMP ?
__________________
- חייך הכל לטובה . |
04-04-11, 09:08 | # 4 |
מנהל פורום, עסק רשום
|
נראה לי הבנתי מה הבעיה שלך.
עד כמה שאני יודע, ובעקבות חיפוש קצר בגוגל, אין ל-mysql פונקציה getdate(). לפיכך, אתה לא יכול להכליל אותה בשאילתא שלך. אני לא מתכנת PHP, אבל אני מניח שמדובר בפונקציית PHP. כך שהאפשרות הראשונה שלך היא להכיל את הערך שהיא מחזירה בשאילתא שלך ולא את הפונקציה עצמה. פשוט תשרשר את זה לשאילתא שלך. האפשרות השניה היא להשתמש בפונקציות המובנות של mysql. למידע נוסף אודות פונקציות זמן ותאריך ב-mysql |
04-04-11, 10:50 | # 5 |
חבר מתקדם
|
שמע אני חייב לציין שכנראה עלית על משהו....
אז שחקתי עם זה קצת... והגעתי לדבר זה ... select * from articles as s where (date(s.sendtime) between date (now()) and date(now())-7) וגם לדבר הזה: select * from articles as s where (s.sendtime between date (CURRENT_TIMESTAMP()) and date(CURRENT_TIMESTAMP())-7) וגם לדבר הזה: select * from articles as s where s.sendtime between CURRENT_TIMESTAMP() and CURRENT_TIMESTAMP()-7 כל האופציות הללו לא מחזירות שגיאה שזה כבר מנחם אבל גם לא מחזירות רשומות למרות שיש רשומות בתאריכים הללו...
__________________
- חייך הכל לטובה . |
04-04-11, 11:43 | # 6 |
מנהל פורום, עסק רשום
|
לדעתי אתה אמור ללכת על השאילתא האחרונה.
מה שכן, אני לא בטוח שהמינוס 7 שאתה שם שם זה אכן 7 ימים. מאוד יכול להיות שמדובר ב-7 שניות. אתה אמור להשתמש בפונקציה מובנת נוספת שתקבל את התאריך הנוכחי ותחסיר ממנו שבעה ימים. נסה להשתמש בפונקציה הזאת, ותתן לה ערך שלילי. |
04-04-11, 13:38 | # 7 |
אין כמו ב127.0.0.1
|
CURRENT_TIMESTAMP מחזירה unixtime, שהוא כמובן בשניות, ולכן אולי עדיף לעבוד עם 60*60*24*7.
|
04-04-11, 18:56 | # 8 |
חבר מתקדם
|
איזה מבעסת השאילתה זו!
טוב עדכון, יגאל ניסיתי את הפונקציה הזו למשל ... (אפילו טרחתי להכניס זמן ) select * from articles as s where s.sendtime > DATEADD(day, -7, '2010-10-21 15:12:09') שימוש ב dateadd עושה בעיות ומציג את אותה שגיאה ארורה.... שוב כנראה שאולי זה בגלל ש dateadd לא יודע לעבוד עם שדה מסוג timestamp או עם ערכי NULL בשדות שאמורים להחזיק DATE... אני שוקל באמת להוסיף זמן ישן לכל הכתבות שיש בהן בתאריך NULL למרות שלא מתחשק לי כל כך למלא את הדטה בייס בזבל. וגם בגלל שהפונקציה between דווקא כן עושה משהו אני לא יודע בדיוק מה אבל לפחות היא לא מחזירה הודעת שגיאה. בלו - ניסיתי לרשום את השאילתה עם המידע שלך לגבי השניות ואפילו סתם תקעתי מספר ארוך פעם אחרת - עדין זה מחזיר 0 רשומות .... ד"א היה חסר לך שם עוד כפול 60 כך שכמעט פספסתי את הפתרון המוזר שרשמתי עליו בהמשך בגלל זה select * from articles as s where (s.sendtime between CURRENT_TIMESTAMP() and CURRENT_TIMESTAMP()-60*60*60*24*7) עדכון: אבל הפתרון נמצא - ותודה לכולם כל אחד כאן תרם פיסות מידע שהובילו בסוף לפתרון דיי מוזר שככל הנראה נבע מה BETWEEN מסתבר שלרשום כך עובד: select * from articles as s where s.sendtime< CURRENT_TIMESTAMP() and s.sendtime>CURRENT_TIMESTAMP()-60*60*60*24*7 מוזר כבר אמרתי?
__________________
- חייך הכל לטובה . |
04-04-11, 21:15 | # 9 |
אין כמו ב127.0.0.1
|
לא חסר, 60 שניות (דקה) כפול 60 דקות (שעה) כפול 24 שעות (יום) כפול 7 ימים (שבוע).
ומוזר, אבל אולי השימוש בפונקציה במבנה שיבש את הפעולה שלו איכשהו. לא אמור לקרות, בכל אופן. |
04-04-11, 21:23 | # 10 |
חבר מתקדם
|
רגע עומר אתה צודק, שיט ...
אוקיי אז משום מה אם אני לא מכפיל בעוד 60 הוא לא מוצא רשומות (למרות שיש כתבות מהשבוע) אם אני מכפיל בעוד 60 זה כן מוצא רשומות - אולי זה סופר מילישניות? :\
__________________
- חייך הכל לטובה . |
חברים פעילים הצופים באשכול זה: 1 (0 חברים ו- 1 אורחים) | |
|
|