msdb.dbo.sysjobs 和上次运行日期和时间

Ste*_*eve 4 sql-server-2008 sql-server t-sql

我知道 last_run_date 和 last_run_time 存储为 Int,但是当转换到 datetime(我有示例)时,是 GMT 时间还是什么?转换后,它与 GUI 日志历史记录显示的时间不匹配。

任何人都可以提供这方面的指导吗?

这是我将值转换为日期时间值的 t-sql 代码:

'last run literal' = dateadd(millisecond, 
    sjs.last_run_time,
    convert(datetime,cast(nullif(sjs.last_run_date,0) as nvarchar(10))))
Run Code Online (Sandbox Code Playgroud)

Han*_*non 9

时间不存储为毫秒数。它是实际时间的数字表示。例如,12:06:59 表示为 120659。1:02:04 pm 表示为 130204。1:23:45 am 表示为 12345。

无需自己计算所有内容,只需使用该dbo.agent_datetime函数即可。

就像是:

SELECT dbo.agent_datetime(last_run_date, last_run_time);
Run Code Online (Sandbox Code Playgroud)

上述函数使用此代码创建一个DATETIME值:

CONVERT(DATETIME,
      CONVERT(NVARCHAR(4),@date / 10000) + N'-' + 
      CONVERT(NVARCHAR(2),(@date % 10000)/100)  + N'-' +
      CONVERT(NVARCHAR(2),@date % 100) + N' ' +        
      CONVERT(NVARCHAR(2),@time / 10000) + N':' +        
      CONVERT(NVARCHAR(2),(@time % 10000)/100) + N':' +        
      CONVERT(NVARCHAR(2),@time % 100),
120)
Run Code Online (Sandbox Code Playgroud)

如果您能忍受向 msdb 添加一个函数,您就可以创建一个性能非常好的表值函数,如下所示:

CREATE FUNCTION dbo.get_agent_datetime(@date INT, @time INT)
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN (
SELECT agent_date_time = 
    CONVERT(DATETIME,
          CONVERT(NVARCHAR(4),@date / 10000) + N'-' + 
          CONVERT(NVARCHAR(2),(@date % 10000)/100)  + N'-' +
          CONVERT(NVARCHAR(2),@date % 100) + N' ' +        
          CONVERT(NVARCHAR(2),@time / 10000) + N':' +        
          CONVERT(NVARCHAR(2),(@time % 10000)/100) + N':' +        
          CONVERT(NVARCHAR(2),@time % 100),
    120)
);
Run Code Online (Sandbox Code Playgroud)

要获取过去 7 天的代理工作历史记录,您可以使用以下命令:

SELECT JobName = sj.name
    , RunDate = dt.agent_date_time
    , sjh.*
FROM dbo.sysjobs sj
    INNER JOIN dbo.sysjobhistory sjh ON sj.job_id = sjh.job_id
CROSS APPLY dbo.get_agent_datetime(sjh.run_date, sjh.run_time) dt
WHERE dt.agent_date_time >= DATEADD(DAY, -7, GETDATE());
Run Code Online (Sandbox Code Playgroud)

显示的日期/时间存储在服务器的本地时间中。


Mic*_*sen 6

如果您不想在 msdb 中创建函数或无法创建函数,则可以使用以下命令:

select*,
dateadd(second, (last_run_time/10000*3600) + (((last_run_time%10000-last_run_time%100)/100)*60) + (last_run_time%100), convert(datetime,cast(nullif(last_run_date,0) as nvarchar(10)))) as [last_run_datetime] 
FROM msdb.dbo.sysjobservers
Run Code Online (Sandbox Code Playgroud)

这也可以应用于 [sysjobhistory] ​​或其他使用这种奇怪的日期和时间整数表示的表

或者你可以使用函数:

msdb.dbo.agent_datetime(last_run_date,last_run_time) as [last_run_datetime]
Run Code Online (Sandbox Code Playgroud)

正如 Max 指出的那样