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)
时间不存储为毫秒数。它是实际时间的数字表示。例如,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)
显示的日期/时间存储在服务器的本地时间中。
如果您不想在 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 指出的那样
归档时间: |
|
查看次数: |
7597 次 |
最近记录: |