שאלה לגבי DATE ב MsSqlServer

שרוליקs

New member
שאלה לגבי DATE ב MsSqlServer ../images/Emo41.gif

בכל הודעה שמשתמש מכניס ללוח הוא מכניס end_date (תאריך סיום) המשתמש בוחר לפי זה כמה זמן ההודעה שלו תופיע. עכשיו אני רוצה להציג באתר רק הודעות שה end_date שלהם עדיין לא עבר. איך עושים את זה? האם לשם כך עלי להשתמש בשדות מסוג DateTime ? ודבר נוסף - כשהכנסתי ערכי תאריך לשדות מסוג DateTime התאריך לא נכנס אלא במקום הופיע התאריך 01/01/1900 לכן עברתי להשתמש בסדות שאינם דייט-טיים - אך גם שניסיתי לחזור ולהשתמש ב דייט-טיים לא הצלחתי לעשות את מה שרשמתי בשאלה הראשונה. תודה מראש, לירן
 

ilaya

New member
אתה חייב להשתמש בשדה מסוג תאריך

אחרת איך תוכל לבצע שאילתה שיוציא כל מה שהתאריך שלו מאוחר מהיום ? אתה צריך שבפסוקית ה- SQL יופיע משהו כמו (לא מדייק בתחביר)
where end_date > "&now()​
לגבי הבעיה שהתאריך לא נכנס - תראה לנו מה לא נכנס וננסה להבין. אתה צריך להקפיד להכניס בפורמט MM/DD/YYYY (לרוב).
 
תאריכים ב-MSSQL עוטפים בגרשיים

ומכניסים בפורמט mm/dd/yyyy השליפה תיעשה ככה:
SELECT * FROM tbl WHERE endDate>GETDATE()​
 
תאריכים וSQL Server

בSQL Server ישנם 2 סוגים של משתנים, ששומרים תאריך ושעה - datetime וsmalldatetime. ההבדל בינהם הוא ברמת הדיוק (datetime מדייק עד רמת 3 אלפיות שניה. smalldatetime מדייק את רמת הדקה), בטווח התאריכים שהם יכולים לעבוד איתם, ובכמות הבתים, שהם צורכים לשמירת הנתונים (datetime צורך 8 בתים, וsmalldatetime צורך 4 בתים). במידה וsmalldatetime עונה על הדרישות עדיף לעבוד איתו מאשר עם datetime (בגלל ביצועים, שזה נושא אחר). SQL Server שומר את השדות באמצעות 2 מספרים שלמים (כלומר לא נשמר סטרינג, שמראה תאריך). מספר ראשון מראה את מספר הימים שחלפו מתאריך 0. המספר השני תלוי בסוג המשתנה. במידה ומדובר בdatetime אז נשמר מספר מעוגל של אלפיות שניה שחלפו מאז חצות. במידה ומדובר בsmalldatetime אז נשמר מספר הדקות שחלפו מאז חצות. כאשר מכניסים לטבלה נתון חלקי, אז יש ערך ברירת מחדל לשאר הנתון, כלומר אם אני מכניס רק תאריך, אז ברירת המחדל היא שהחלק של השעה יהיה חצות. לעומת זאת אם אני מכניס רק שעה, אז ברירת המחדל של התאריך היא 01/01/1900. הכנסת הנתונים יכולה ליצור בעיות. קחו את התאריך הבא - 12/04/68. האם מדובר ב4 לדצמבר? אולי מדובר ב12 לאפריל? כל עוד לא הגדרתי את פורמט התאריך, אין התייחסות ודאית לתאריך. לשרת יש ברירת מחדל, שנלקחת ממערכת ההפעלה, אבל יכולה להשתנות לפי משתמש או לפי session. המשמעות של זה היא שמשפט הSQL הבא:
UPDATE MyTable SET MyCol = '20/02/2004'​
יכול לעבוד מצוין על שרת אחד, ולעומת זאת על שרת אחר להיכשל עם הודעת שגיאה שהערך לא מציין תאריך. הסיבה היא שבשרת אחד ההתיחסות לתאריך היא בפורמט mm/yy/dd ובשרת אחר הפורמט הוא dd/mm/yy. בתור מתכנתים אנו צריכים לדאוג לכך, שהאפליקציה שלנו תעבוד ללא קשר לקינפוג השרת. לא ניתן גם לתת דרישה, לגבי קינפוג השרת או קינפוג פרטי משתמש. יש לנו מספר דרכים לדאוג לכך שהשרת ידע באיזה פורמט אנו עובדים, ללא קשר לקינפוג השרת. דרך אחת היא פשוט להגיד לשרת. ניתן להשתמש במשפט SET. לדוגמא:
create table Example (sdt smalldatetime) go set dateformat DMY insert into Example (sdt) values ('20/12/2004') set dateformat MDY insert into Example (sdt) values ('12/20/2004') select * from Example​
באמצעות הגדרת הפורמט של התאריך, פעם הוכנס תאריך בפורמט dd/mm/yyyy ופעם הוכנס תאריך בפורמט mm/dd/yyyy. במידה ותריצו את 2 משפטי הinsert ללא משפטי הSET, אחד מהם ייכשל. דרך נוספת שימוש בפורמט, שהשרת תמיד יזהה ללא קשר לקינפוג שלו. שליחה של סטרינג בפורמט yyyymmdd ללא הפרדה, תכניס תמיד את אותו התאריך ללא קשר לקינפוג השרת. לדוגמא משפט הSQL הבא:
insert into Example (sdt) values ('20040220')​
דגש חשוב - לא לשכוח להוסיף גרשיים מסביב לסטרינג, אחרת השרת יזהה את הסטרינג כמספר. תקבלו תאריך, אבל לא את התאריך, שאליו התכוונתם. יש עוד פורמטים, שהשרת תמיד יזהה את התאריך בצורה אחידה. ניתן לראות אותם בbooks on line תחת הערך cast and convert. דרך שלישית היא להשתמש בפונציה convert. לפונקציה convert יש פרמטר שלישי, שלא כולם מודעים אליו. הפרמטר נקרא style ותפקידו להגיד לשרת איך להתיחס להמרה בין סטרינג ותאריך. לדוגמא:
insert into Example (sdt) values (convert(smalldatetime, 'FEB 20, 2004', 107))​
אני ממליץ לקרוא בbooks on line על הפונקציה convert ולראות הפורמטים המוכרים לשרת ואת השימוש בהם
 

ilaya

New member
../images/Emo45.gif איך אני מגדיר את את ה- SET

דרך ה- EM ? איך אני יכול לקבוע דרך שם אם הפורמט יהיה MM/DD/YYYY או DD/MM/YYYY ?
 
זה לא נעשה בEM

זה לא נעשה בEM. הנקודה היא, שצריך לדאוג לדברים האלו בקוד. בו נניח, שאתה מספק לי תוכנה, ואומר לי שאני צריך לדאוג, שהשרת יהיה מקונפג, כך שתמיד יעבוד בפורמט dd\mm\yyyy. אחרי שבוע ספק תוכנה אחר נותן לי תוכנה, אבל הוא אומר לי שהשרת חייב להיות מקונפג כך שתמיד הוא יפרש את הפורמט של התאריכים כmm\dd\yyyy. במצב כזה אני יאלץ לבצע התקנה של שרת נוסף. יכול להיות, שאני פשוט אחליט לוותר על אחת התוכנות. כדי לא להגיע למצב הזה, מומלץ, שהאפליקציה תטפל בפורמט של התאריכים. הדרך האהובה עלי ביותר, היא להשתמש תמיד בפורמט, שניתן לפרש אותו בדרך אחת בלבד. הפורמטים שאני משתמש בהם הם: פורמט ISO (סטייל 112) - yyyymmdd (במידה ואני צריך תאריך בלבד ללא שעה) פורמט ODBC Canonical (סטייל 120) - yyyy-mm-dd hh:mi:ss (במידה ואני צריך שעה ללא אלפיות שנייה). פורמט ODBC Canonical (סטייל 121) - yyyy-mm-dd hh:mi:ss.mmm (במידה ואני צריך שעה עם אלפיות שניה). הייתרון הגדול בפורמטים האלו הוא, שאין שום צורך להגדיר לו באיזה פורמט משתמשים. ללא שום קשר לקונפיגורציה כאשר השרת רואה את אחד הסטרינגים הבאים:
'20040220' '2004-02-20 09:53:00' '2004-02-20 09:53:00.203'​
הוא יודע בדיוק איך לפרש אותם. במקרה כזה אני לא צריך להשתמש במשפט SET DATEFORMAT. במידה ואני כן רוצה להשתמש בפורמט dd/mm/yyyy, אז מומלץ להשתמש במשפט SET DATEFORMAT DMY. במקרה כזה כדאי לכתוב את המשפט לפני משפט הinsert (כמו שכתבתי בדוגמא במסר הקודם בשרשור)
 

Trranger

New member
צריך לפתוח קטגוריה לחובב טניס

בFAQ ולהכניס את כל ההודעות שלו לשמה... זה חומר חשוב
 
למעלה