Madeira  

עבודה עם שעות ותאריכים של 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

 image

 

שימו לב לעמודות ה 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

image

בצורה כזו הרבה יותר נוח לנתח את הנתונים, למיין אותם וכו’…



תגובות הגולשים

  1. איתן בלומין מאת איתן בלומין:

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

    תודה!

על-מנת להשאיר תגובה אנא הכנס את הפרטים או התחבר




הערה: התגובות עוברות סינון, לאחריו תופיע התגובה. אין צורך להכניס שוב את התגובה.

תגובות אחרונות