none
שדה ב VIEW שבודק אם היום הוא בין שני תאריכים RRS feed

  • שאלה

  • שלום לכולם

    אני עובד ב sql server 2008 r2 express.

    יש לי טבלה המכילה שני שדות תאריך: BeginDate ו EndDate. יצרתי VIEW בהתבסס על טבלה זו והענסתי בו את שדות התאריך הנ"ל.

    אני מעוניין ליצור ב VIEW שדה שבודק האם היום (זמן מערכת) נמצא בין  BeginDate ו EndDate.

    ניסיתי ליצור את השדה הבא  GETDATE()  between BeginDate and EndDate  AS check ב VIEW וקיבלתי שגיאה. אותה תוצאה גם ל  ((GETDATE()  >= BeginDate) and (GETDATE()<=  EndDate) .

    אשמח לכל עזרה בנושא

    גיא

    יום חמישי 13 יוני 2013 10:09

תשובות

  • גיא אתה יכול לראות את הדוגמה הבאה אם היא עוזרת לך (וזה רעיון גרוע מאוד שאני שם תשובה מוכנה דרך אגב במקום לשמוע בדיוק היכן נתקלת בבעיה ולהפנות אותך למקום בו תוכל ללמוד ולהבין את הבעיה ולא רק לראות תשובה). בכל מקרה אנא הקפד בעתיד לצרף DDL+DML

    בדוק אם זה עוזר לך

    -- נעבור למסד הנתונים של המשחקים
    -- כמובן למסד הנתונים שלנו שכבר קוקו לחלוטין מרוב משחקים עליו
    use QQ
    go
    
    -- DDL
    create table GyeInfoTbl
    (
    StartTimeFld datetime,
    EndTimeFld datetime
    )
    GO
    
    -- DML: inserting random data (1000 rows)
    declare @I as int
    select @I = CHECKSUM(NewId()) % 14
    insert GyeInfoTbl values (DATEADD(DAY, @I, GETDATE()),DATEADD(DAY, @I + 3, GETDATE()))
    go 1000
    
    -- Check
    select * from GyeInfoTbl
    GO
    
    -- we first try to build a simple query that bring what we need
    select 
    	StartTimeFld
    	,EndTimeFld 
    	, case
    		when GETDATE() >= StartTimeFld and GETDATE() <= EndTimeFld then 1
    		else 0
    	end
    from GyeInfoTbl
    go
    
    -- now we will create view using the select we build
    -- DDL
    create view GyeInfoview as
    	select 
    		StartTimeFld
    		,EndTimeFld 
    		, case
    			when GETDATE() >= StartTimeFld and GETDATE() <= EndTimeFld then 1
    			else 0
    		end as True_False
    	from GyeInfoTbl
    GO
    
    -- check all together
    select * from GyeInfoview
    go
    
    -- clean all
    drop view GyeInfoview
    drop table GyeInfoTbl
    GO
    

    אני מקווה שזה עוזר לך


    signature

    • סומן כתשובה על-ידי guy doron יום שישי 14 יוני 2013 03:39
    יום חמישי 13 יוני 2013 12:31
    מנחה דיון

כל התגובות

  • שלום גיא

    אתה יכול להעלות DDL+DML כדי שנוכל לראות על מה מדובר ולא לנחש?

    * כמו כן לא ברור לי מה אתה רוצה לקבל ב VIEW. אתה רוצה לסנן רק רשומות שעומדות בתנאי או להציג משהו בגנון true/false אם התנאי מתקיים או לא? ז"א מה אתה רוצה שיתבצע עם התוצאות של הבדיקה?


    signature

    יום חמישי 13 יוני 2013 11:42
    מנחה דיון
  • גיא אתה יכול לראות את הדוגמה הבאה אם היא עוזרת לך (וזה רעיון גרוע מאוד שאני שם תשובה מוכנה דרך אגב במקום לשמוע בדיוק היכן נתקלת בבעיה ולהפנות אותך למקום בו תוכל ללמוד ולהבין את הבעיה ולא רק לראות תשובה). בכל מקרה אנא הקפד בעתיד לצרף DDL+DML

    בדוק אם זה עוזר לך

    -- נעבור למסד הנתונים של המשחקים
    -- כמובן למסד הנתונים שלנו שכבר קוקו לחלוטין מרוב משחקים עליו
    use QQ
    go
    
    -- DDL
    create table GyeInfoTbl
    (
    StartTimeFld datetime,
    EndTimeFld datetime
    )
    GO
    
    -- DML: inserting random data (1000 rows)
    declare @I as int
    select @I = CHECKSUM(NewId()) % 14
    insert GyeInfoTbl values (DATEADD(DAY, @I, GETDATE()),DATEADD(DAY, @I + 3, GETDATE()))
    go 1000
    
    -- Check
    select * from GyeInfoTbl
    GO
    
    -- we first try to build a simple query that bring what we need
    select 
    	StartTimeFld
    	,EndTimeFld 
    	, case
    		when GETDATE() >= StartTimeFld and GETDATE() <= EndTimeFld then 1
    		else 0
    	end
    from GyeInfoTbl
    go
    
    -- now we will create view using the select we build
    -- DDL
    create view GyeInfoview as
    	select 
    		StartTimeFld
    		,EndTimeFld 
    		, case
    			when GETDATE() >= StartTimeFld and GETDATE() <= EndTimeFld then 1
    			else 0
    		end as True_False
    	from GyeInfoTbl
    GO
    
    -- check all together
    select * from GyeInfoview
    go
    
    -- clean all
    drop view GyeInfoview
    drop table GyeInfoTbl
    GO
    

    אני מקווה שזה עוזר לך


    signature

    • סומן כתשובה על-ידי guy doron יום שישי 14 יוני 2013 03:39
    יום חמישי 13 יוני 2013 12:31
    מנחה דיון
  • היי

    תודה על התגובה

    לו הייתי יודע מזה DDL+DML הייתי שמח לנסות להעלות את זה..:)

    האם אני יכול לצרף את קובץ הדטה בייס לכאן?

    בכל מקרה אני מעוניין ליצור שדה אינפורמטיבי שנותן 1 אם היום נופל בטווח התאריכים של השורה ו 0 אם לא

    גיא


    גיא דורון

    • סומן כתשובה על-ידי guy doron יום שישי 14 יוני 2013 03:39
    • סימון כתשובה בוטל על-ידי guy doron יום שישי 14 יוני 2013 03:40
    יום שישי 14 יוני 2013 03:17
  • מעולה!! פתר את הבעיה

    מיליון תודות

    גיא


    גיא דורון

    יום שישי 14 יוני 2013 03:25
  • בוקר טוב גיא

    אתה יכול לצרף את הקובץ של מסד הנתונים במקום DDL+DML אבל זה פחות מקצועי ופחות נוח. בקישור הבא תוכל להבין מה זה DDL ומה זה DML (זה סוגי שאילתות בדיוק במקום לצרף את הקובץ)

    http://ariely.info/Blog/tabid/83/EntryId/70/Data-Definition-Language-DDL-and-Data-Manipulation-Language-DML.aspx

    אני מבין שהפתרון ששמתי לך נתן את התשובה.

    * אנא עבור על השירשור וסמן את התשובה (או התשובות) על ידי לחיצה על הקישור בתחתי ההודעה המתאימה עם המילים "סמן כתשובה". כמו כן עבור על כל השירשור וסמן כל הודעה שניראית לך מועילה אפילו קצת (לא רק מועילה לפתרון אלא כל הודעה שתורמת משהו לחיים) על ידי לחיצה על הקישור "הצבע כמועיל" שמופיע בכל הודעה בחלק העליון שמאלי של ההודעה.

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

    ברוך הבא לפורום והמשך גלישה מהנה :-)
    * כמובן אם יש עדיין שאלות אתה מוזמן להמשיך את הדיון או לפתוח דיון חדש


    signature

    • סומן כתשובה על-ידי guy doron יום שישי 14 יוני 2013 03:40
    • סימון כתשובה בוטל על-ידי guy doron יום שישי 14 יוני 2013 03:40
    יום שישי 14 יוני 2013 03:37
    מנחה דיון
  • אעשה זאת.

    מודה לך שוב על הטרחה שעברת על מנת לעזור לי.

    ממש פתרת לי בעיה מטרידה

    גיא


    גיא דורון

    יום שישי 14 יוני 2013 03:39
  • אם כל מי ששאל שאלה היה נותן מליון תודות אתה יודע כמה תודות כבר הייתי אוסף עד היום :-)

    האמת שלא כל כך הרבה כי הרוב שוכחים את החלק הזה בדיון :-(

    תודה על התודה וגלישה מהנה


    signature

    יום שישי 14 יוני 2013 03:39
    מנחה דיון
  • האם יש סקריפט שמקבל בסיס נתונים מסויים ומחזיר את ה DDL+DML שלו? כי אם יש לי בסיס נתונים גדול ומורכב אני מתקשה לראות את עצמי יוצר ביד את כל ה DDL+DML שלו. במקרה כזה עדיף לצרף את הקובץ וזהו.

    גיא דורון

    יום שישי 14 יוני 2013 03:46
  • אם אתה תורם מזמנך וממרצך לעזור לאחרים אין דבר כזה מספיק תודה :)

    אחלה יום


    גיא דורון

    יום שישי 14 יוני 2013 04:25
  • כמובן :-)

    אפשרות 1 (יותר מתאים אם רוצים לייצר סקריפט לכל מסד הנתונים כולל כל או הרבה להרבה מאוד אלמנטים כולל הקשרים בינהם)

    1. פתח את ה SSMS

    2. כפתור ימני על מסד הנתונים

    4. בחר ב 

    Task --> Generate Script

    יפתח לך חלון של אשף יצירת סקריפט, לחץ NEXT

    5. בחר את האלמנטים שאתה רוצה לייצר את הסקריפט שלהם (או בחר באפשרות של לייצר סקריפט לכל מסד הנתונים כולל הכל)

    6. שמור את הסקריפטים לקובץ...

    אפשרות 2 (בדרך כלל יותר מתאים לפורום מפני שאנחנו רוצים רק את סקריפט לטבלה אחת או 2 שעליהם אתה שואל את השאלה)

    1. פתח SSMS

    2. כפתור ימני על הטבלה

    3. בחר ב

    Script Table as --> Create To --> New Query Editor Windows

    יפתח לך השאלתה של יצירת הטבלה בחלון 

    * באותה צורה אפשר לייצר גם סקריפט רק ליצירת מסד הנתונים בלי כל האלמנטים שיש בו.

    4. תערוך מעט את השאילתה אם אתה רוצה (למשל אפשר לנקות דברים מיותרים)

    5. צרף לשאלה שלך את הקוד של ה DDL

    לגבי DML

    אפשר לייצר סקריפט בעזרת SSIS שמייצר שאילתה כולל כל הנתונים אבל בפורום נהוג לייצר לבד שאילתות עם דוגמה של 10-20 או כמה שצריך רשומות ולא כל הרשומות (אחרי הכל אתה לא רוצה סקריפט של הכנסת 200 מליון רשומות בשביל להסבר את השאלה שלך)

    זה פשוט וגם תרגול לא רע להכין לבד שאילתת INSERT פשוטה שתכניס למסד הנתונים כמה רשומות כדי שנוכל לדון בהן בפורום

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


    signature

    יום שישי 14 יוני 2013 04:31
    מנחה דיון
  • חשוב לציין!

    בפורום לא נהוג ולא טוב לצרף סתם DDL של מה שלא קשור לשאלה. אם השאלה קשורה ל 2 טבלאות אז תצרף רק את ה DDL של הטבלאות הרלוונטיות (וכמובן כמה רשומות לדוגמה ז"א DML מתאים)

    אנחנו לא רוצים להכביד על מי שמנסה לעזור בחומר מיותר אלא לצמצם את הנתונים רק למה שצריך אבל מצד שני לא לשכוח לספק את כל מה שצריך


    signature

    יום שישי 14 יוני 2013 04:34
    מנחה דיון
  • בסדר גמור לגבי השרשור.

    נשמע לי פשוט יותר לצרף את קובץ הדטה בייס וזהו. לא ככה?

    גיא


    גיא דורון

    יום שישי 14 יוני 2013 05:36
  • אתה יכול אם זה יותר פשוט בשבילך

    אבל מה אני אעשה אם אני עובד עם מסדי נתונים גדולים של 100 טרה בייט?!? אני לא יכול אפילו לבצע להם גיבוי מלא אלא רק דיפרניאלי אז כיצד אני אצרף את הקובץ לפורום :-)

    ויש עוד מגבלה... רוב מסדי נתונים מכילים נתונים שאסור להפיץ אותם וחברות לא יאשרו להעלות את מסד הנתונים שלהם רק כדי שה DBA שלהם ישאל שאלה :-)

    בעיה נוספת היא שמי שבא לעזור לא בטוח שרוצה עכשיו לשחזר מסד הנתונים חדש שלם והרבה יותר מהר וקל בשבילו פשוט לייצר טבלה חדשה במסד נתונים של משחקים שהוא מחזיק. מה גם שעוד כמה ימים של תירגול אתה תלמד שזה מאוד קל לכתוב שאילתה של יצירת טבלה לבד ולהריץ אותה במקום להעזר בתוכנות מוכנות לזה.

    הבעיה האחרונה כרגע שעולה לי בראש היא העובדה שאם אתה מעביר שאילתה אנחנו לא תמיד צריכים להריץ את השאילתה אלא מספיק לרובנו רק להיסתכל עליה ולהבין מה קורה. הרבה פעמים אפשר לשים תשובה בהתאם בלי שצריך בכלל להריץ ולבדוק. כמובן שלפעמים עדיף לבדוק את התשובה ולהריץ אותה. 

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


    signature

    יום שישי 14 יוני 2013 06:51
    מנחה דיון