עבודה עם שעות ותאריכים של SQL AGENT
תאריך: 24 אוגוסט, 2011 | מאת: שי אנגלברג
עולם ה DBA-ים מתחלק בגסות לשתי קבוצות:
אלו שכבר ניתחו את טבלאות המערכת והלוגים של ה SQL Agent ואלו שיעשו זאת בקרוב מאוד.
כידוע, טבלאות המערכת של ה Agent מצויות ב msdb.
ברוב הטבלאות שמשמשות את ה Agent הרישום של תאריכים ושעות מופיע בצורה משונה של שני ערכים מספריים – האחד מסמל את התאריך והשני מסמל את השעה.
כך ניתן לראות את זמני תחילת הריצה של Job ושל ה steps שלו בטבלת המערכת dbo.sysjobhistory (המכילה את היסטוריית הריצה של ה Jobs)
1: SELECT
2: job_id,step_id,step_name,run_status,run_date,run_time,run_duration
3: FROM msdb.dbo.sysjobhistory

שימו לב לעמודות ה run_date ו run_time שם מופיעים מספרים שמייצגים תאריך ושעה. שימו לב, סוג העמודות הנ”ל הוא INT.
התאריך מופיע בפורמט YYYYMMDD.
השעה מופיעה בפורמט HHMMSS בשעון של 24 שעות.
כפי שכתבתי, הצורה הזו של שמירת תאריכים ושעות משמשת כמעט בכל הטבלאות של ה Agent כמו למשל:
dbo.sysjobschedules
dbo.sysschedules
ועוד.<
הפתרון
כדי לפענח או יותר נכון להמיר את המספרים האלו ל Datetime, ישנה פונקצית מערכת קטנה ונחמדה ב msdb שמקבלת שני פרמטרים, שניהם מסוג INT ומחזירה DateTime.
הפונקצייה נקראת dbo.agent_datetime.
הפרמטר הראשון הוא המספר שמייצג את התאריך והשני הוא המספר שמייצג את השעה.
תוכן הפונקציה הוא:
1: CREATE FUNCTION agent_datetime(@date int, @time int)
2: RETURNS DATETIME
3: AS
4: BEGIN
5: RETURN
6: (
7: CONVERT(DATETIME,
8: CONVERT(NVARCHAR(4),@date / 10000) + N'-' +
9: CONVERT(NVARCHAR(2),(@date % 10000)/100) + N'-' +
10: CONVERT(NVARCHAR(2),@date % 100) + N' ' +
11: CONVERT(NVARCHAR(2),@time / 10000) + N':' +
12: CONVERT(NVARCHAR(2),(@time % 10000)/100) + N':' +
13: CONVERT(NVARCHAR(2),@time % 100),
14: 120)
15: )
16: END
זוהי לא פונקציה מסובכת לכתיבה או להבנה, אך בהיותנו DBA חסכנים (שלא לומר עצלנים) טוב לדעת שקיימת פונקציה בכל שרת שתעזור לנו לנתח את מה שכתוב בטבלאות המערכת של ה Agent בלי להשקיע בכתיבה.
לדוגמא, על מנת להבין את הנתונים שמופיעים בטבלת sysjobhistory, נריץ את השאילתא הבאה:
1: SELECT
2: job_id,step_id,step_name,run_status,dbo.agent_datetime(run_date,run_time) AS Run_DateTime,run_duration
3: FROM msdb.dbo.sysjobhistory

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