הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   בעיה בשאילתא (https://hosts.co.il/forums/showthread.php?t=88836)

gillllll 03-04-11 20:25

בעיה בשאילתא
 
קודם כל אני שונא את הכיתוב הבא- זו השגיאה:
#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 הימים האחרונים אבל ללא הועיל - הבעיה נשארת .
מה לפי דעתכם הגורם ומה אפשר לעשות?

IgalSt 03-04-11 20:42

אם אתה חושב שהבעיה היא בכך שיש הרבה ערכים שהם NULL, למה שלא תתן ערך ברירת מחדל של איזשהו תאריך בעבר הרחוק? לדוגמא 2000-01-01?

למרות שמהשגיאה שאתה מקבל עושה רושם שהבעיה היא במקום אחר.
שאילתות select פשוטות כמו select * from articles limit 10 עובדות?

gillllll 03-04-11 22:55

כן זה עובד ברגע שאני מוחק את בדיקה של התאריך העניין הוא שאתם באמת חושבים שזו הבעיה או שאולי אי אפשר לבצע את ההשוואות של BETWEEN או DATEADD על TIMESTAMP ?

IgalSt 04-04-11 09:08

נראה לי הבנתי מה הבעיה שלך.
עד כמה שאני יודע, ובעקבות חיפוש קצר בגוגל, אין ל-mysql פונקציה getdate().
לפיכך, אתה לא יכול להכליל אותה בשאילתא שלך.

אני לא מתכנת PHP, אבל אני מניח שמדובר בפונקציית PHP. כך שהאפשרות הראשונה שלך היא להכיל את הערך שהיא מחזירה בשאילתא שלך ולא את הפונקציה עצמה. פשוט תשרשר את זה לשאילתא שלך.
האפשרות השניה היא להשתמש בפונקציות המובנות של mysql. למידע נוסף אודות פונקציות זמן ותאריך ב-mysql

gillllll 04-04-11 10:50

שמע אני חייב לציין שכנראה עלית על משהו....
אז שחקתי עם זה קצת...
והגעתי לדבר זה ...
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

כל האופציות הללו לא מחזירות שגיאה שזה כבר מנחם אבל גם לא מחזירות רשומות למרות שיש רשומות בתאריכים הללו...

IgalSt 04-04-11 11:43

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

BlueNosE 04-04-11 13:38

CURRENT_TIMESTAMP מחזירה unixtime, שהוא כמובן בשניות, ולכן אולי עדיף לעבוד עם 60*60*24*7.

gillllll 04-04-11 18:56

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

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

מוזר כבר אמרתי?

BlueNosE 04-04-11 21:15

לא חסר, 60 שניות (דקה) כפול 60 דקות (שעה) כפול 24 שעות (יום) כפול 7 ימים (שבוע).

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

gillllll 04-04-11 21:23

רגע עומר אתה צודק, שיט ...
אוקיי אז משום מה אם אני לא מכפיל בעוד 60 הוא לא מוצא רשומות (למרות שיש כתבות מהשבוע) אם אני מכפיל בעוד 60 זה כן מוצא רשומות - אולי זה סופר מילישניות? :\

BlueNosE 04-04-11 21:48

לא, כנראה יש בעיה בTIMESTAMP שנשמר. תוכל להראות בבקשה את הקוד שמכניס נתונים למסד?

gillllll 05-04-11 00:46

העניין הוא שזה אפילו לא אני שמכניס את התאריך למסד, אלא זה אוטומטי אני מוסיף תוכן ולשדה מסוג TIMESTAMP הגדרתי ברירת מחדל של CURRENT_TIMESTAMP .
דוגמא לתאריך שהוכנס לא מזמן 2011-04-04 23:22:45 כך זה נראה בשדה sendtime

gillllll 05-04-11 00:58

אוי נראה לי שאני מבין מה הבעיה....
עומר זה לא מדויק מה שאמרת כי זה לא עושה המרה כזו של זמנים לפי ההגדרה - TIMESTAMP הוא כמו NOW
CURRENT_TIMESTAMP and CURRENT_TIMESTAMP() are synonyms for NOW().
ואם הוא כמו NOW אז:
http://dev.mysql.com/doc/refman/5.1/...l#function_now
כלומר המעבר מתאריך מספר הוא כנראה כזה...
mysql> SELECT NOW();
-> '2007-12-15 23:50:26'
mysql> SELECT NOW() + 0;
-> 20071215235026.000000

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

IgalSt 05-04-11 11:00

ציטוט:

נכתב במקור על ידי gillllll (פרסם 800673)
אוי נראה לי שאני מבין מה הבעיה....
עומר זה לא מדויק מה שאמרת כי זה לא עושה המרה כזו של זמנים לפי ההגדרה - TIMESTAMP הוא כמו NOW
CURRENT_TIMESTAMP and CURRENT_TIMESTAMP() are synonyms for NOW().
ואם הוא כמו NOW אז:
http://dev.mysql.com/doc/refman/5.1/...l#function_now
כלומר המעבר מתאריך מספר הוא כנראה כזה...
mysql> SELECT NOW();
-> '2007-12-15 23:50:26'
mysql> SELECT NOW() + 0;
-> 20071215235026.000000

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

זו הסיבה שאני ממליץ להשתמש בפונקציות מובנות להוספה/להסרה של זמנים.
אם אתה מעוניין להבין איך זה עובד אז אכן עדיף לכתוב לבד, אבל כשאתה מפתח לא בשביל הפאן אלא בשביל לעשות עבודה, חבל על בזבוז הזמן :-)

BlueNosE 05-04-11 12:04

במקום להשתמש בברירת המחדל, תשמור בבקשה time() בשדה הזמן שלך כשאתה מכניס למסד.
לא חשבתי לרגע שאתה משתמש במבנה כזה של תאריך, בגלל זה גם רשמתי את מה שרשמתי.
ככה לא תהיה בעיה לא עם הBETWEEN ולא עם שום דבר אחר.

האמת שלי היה בראש את הפונקציה UNIX_TIMESTAMP(), ומשום מה התייחסתי ל-CURRENT_TIMESTAMP().
בכל מקרה החישוב של ה60*60*24*7 תופס לפונקציה UNIX_TIMESTAMP().

gillllll 05-04-11 18:18

טוב נראה לי שאני פשוט אמחק את השדה ואעביר אותו לשדה מסוג TIMEDATE וזהו... איזה פונקציות מובנות יש לסיפור הזה כדי להכניס מזמן של שפת התכנות - לזמן ש MYSQL מקבל? תוכלו לתת לי איזה קישור זה יהיה מעולה :\ עצלנות זה שורש כל הרוע ככה מתחילות בעיות :) ארור מי שהמציא את ה TIMESTAMP מה הוא חשב לעצמו!?!

IgalSt 05-04-11 18:48

ציטוט:

נכתב במקור על ידי gillllll (פרסם 800714)
טוב נראה לי שאני פשוט אמחק את השדה ואעביר אותו לשדה מסוג TIMEDATE וזהו... איזה פונקציות מובנות יש לסיפור הזה כדי להכניס מזמן של שפת התכנות - לזמן ש MYSQL מקבל? תוכלו לתת לי איזה קישור זה יהיה מעולה :\ עצלנות זה שורש כל הרוע ככה מתחילות בעיות :) ארור מי שהמציא את ה TIMESTAMP מה הוא חשב לעצמו!?!

אני דווקא עובד בהצלחה עם timestamp.
אם אתה רוצה לעבוד עם שדה מסוג timedate אז כשאתה מזין ערכים פנימה זה אמור להיות בפורמט
YYYY-MM-DD HH:MM:SS
ואז אתה יכול לשרשר ערך מהפונקציות של ה-PHP אם יותר נוח לך

gillllll 06-04-11 07:03

ציטוט:

נכתב במקור על ידי IgalSt (פרסם 800715)
אני דווקא עובד בהצלחה עם timestamp.
אם אתה רוצה לעבוד עם שדה מסוג timedate אז כשאתה מזין ערכים פנימה זה אמור להיות בפורמט
YYYY-MM-DD HH:MM:SS
ואז אתה יכול לשרשר ערך מהפונקציות של ה-PHP אם יותר נוח לך

אז איך אתה בודק בטווח של תאריכים עם השדה הזה |Rolleyes| הוא פשוט לא ישים ב MYSQL .... (או שהוא לא אוהב אותי זה גם אופציה :) )

OrPol 07-04-11 13:16

ציטוט:

נכתב במקור על ידי BlueNosE (פרסם 800685)
במקום להשתמש בברירת המחדל, תשמור בבקשה time() בשדה הזמן שלך כשאתה מכניס למסד.
לא חשבתי לרגע שאתה משתמש במבנה כזה של תאריך, בגלל זה גם רשמתי את מה שרשמתי.
ככה לא תהיה בעיה לא עם הBETWEEN ולא עם שום דבר אחר.

האמת שלי היה בראש את הפונקציה UNIX_TIMESTAMP(), ומשום מה התייחסתי ל-CURRENT_TIMESTAMP().
בכל מקרה החישוב של ה60*60*24*7 תופס לפונקציה UNIX_TIMESTAMP().

+1

אני משתמש רק בtime()
פותר לי את כל הבעיות.


כל הזמנים הם GMT +2. הזמן כעת הוא 13:46.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ