正文:
 
1、SQL Server 代理作业概述
 
本文不是详细讲解代理作业的,仅仅从代理作业历史表(dbo.sysjobhistory)的角度来学习和研究代理作业的执行时间。执行以下T-SQL代码:
SELECT
[job_id]
,[step_id]
,[run_status]
,[run_date]
,[run_time]
,[run_duration]
FROM
[dbo].[sysjobhistory]
WHERE
[run_duration] >= 1
ORDER BY
[run_duration] DESC;
GO
以上T-SQL的执行结果如下图:
从以上图中很容易看到字段列run_date、run_time和run_duration的数据格式。结合微软联机帮助文档学习到:run_date字段列值的数据格式为yyyMMdd(该列值表示代理作业开始执行时的日期部分,如上图run_date字段列值为20170316表示该作业开始执行于2017-03-16这个日期点),run_time字段列值的数据格式为hhmmss(该列值表示代理作业开始执行时的时间部分,如上图run_time字段列值为20000表示执行于02:00:00这个时间点),run_duration字段列值的数据格式为hhmmss(这个是持续时间的数据格式,例如上图中的dun_duration为127表示改作业执行从开始到完成共持续了1分27秒)。
 
通常情况下,我在数据表设计尤其涉及到记录活动发生的日期时间点时更多的使用datetime这个数据类型的字段列。针对run_date和run_time的数据格式可以通过dbo.agent_datetime标量函数来转换为datetime数据类型。执行以下T-SQL代码:
SELECT [dbo].[agent_datetime](20170316, 20000) AS [run_datetime];
GO

以上T-SQL的执行结果如下图:

那么如何将run_duration字段列值转换为秒、分、小时等?下面继续探究。
 
2、获取代理作业执行时间方法一
 
这个方法具体参考了dbo.agent_datetime函数的定义和查看SQLServer 代理作业的历史信息这边博文中提供的方法,具体实现的T-SQL代码如下:
 
SELECT
[T1].[job_id]
,[T1].[name] AS [job_name]
,[T2].[run_status]
,[T2].[run_date]
,[T2].[run_time]
,[dbo].[agent_datetime]([T2].[run_date], [T2].[run_time]) AS [run_datetime]
,[T2].[run_duration]
,([T2].[run_duration] /10000 * 3600 + [T2].[run_duration] % 10000 / 100 * 60 + [T2].[run_duration] % 100 + 31) AS [run_duration_s]
FROM
[dbo].[sysjobs] AS [T1]
INNER JOIN [dbo].[sysjobhistory] AS [T2]
ON [T2].[job_id] = [T1].[job_id]
WHERE
[T1].[enabled] = 1
AND [T2].[step_id] = 0
AND [T2].[run_duration] >= 1
ORDER BY
[T2].[job_id] ASC
,[T2].[run_date] ASC
GO
以上T-SQL的执行结果如下图:
注意:
  • 这种方法才用了精度设置,默认精度为31秒,也就是说如果作业的执行持续时间超过30秒(包括等于30秒)时会自动增加31秒。
 
3、获取代理作业执行时间方法二
 
这个方法依然使用dbo.agent_datetime函数,还会增加dateadd函数和datediff函数。具体实现的T-SQL代码如下:
SELECT
[T1].[job_id]
,[T1].[name] AS [job_name]
,[T2].[run_status]
,[T2].[run_date]
,[T2].[run_time]
,[dbo].[agent_datetime]([T2].[run_date], [T2].[run_time]) AS [run_datetime]
,[T2].[run_duration]
,DATEDIFF(SECOND, '1900-01-01', DATEADD(SECOND, 31, [dbo].[agent_datetime](19000101, [run_duration]))) AS [run_duration_s]
FROM
[dbo].[sysjobs] AS T1
INNER JOIN [dbo].[sysjobhistory] AS T2
ON [T2].[job_id] = [T1].[job_id]
WHERE
[T1].[enabled] = 1
AND [T2].[step_id] = 0
AND [T2].[run_duration] >= 1
ORDER BY
[T2].[job_id] ASC
,[T2].[run_date] ASC
GO
以上T-SQL的执行结果如下图:
注意:
  • 该方法依然采用了默认精度为31秒。
  • sql server系统提供的日期函数采用的默认基准日期是1900-01-01,这个可以使用0替代换。
 

4、总结语

 
通过研读博友的文章和学习微软联机文档,确实能够学到很多的知识。sql 的路上唯有继续修行,才能了解的更多。
 
 

(原)SQL Server 代理作业执行持续时间简述的更多相关文章

  1. SQL SERVER 2008复制数据库时发生执行SQL Server代理作业错误

    1. 情况说明 在利用SQL SERVER数据库复制向导,能够很方便的将一个数据库从一台服务器复制到另一台服务器上,具体操作步骤也十分简单. 不过在实际操作过程常发生“执行SQL SERVER代理作业 ...

  2. 第二篇 SQL Server代理作业步骤和子系统

    本篇文章是SQL Server代理系列的第二篇,详细内容请参考原文. SQL Server代理作业由一系列的一个或多个作业步骤组成.一个作业步骤分配给一个特定的作业子系统(确定作业步骤去完成的工作). ...

  3. 【译】第二篇 SQL Server代理作业步骤和子系统

    本篇文章是SQL Server代理系列的第二篇,详细内容请参考原文. SQL Server代理作业由一系列的一个或多个作业步骤组成.一个作业步骤分配给一个特定的作业子系统(确定作业步骤去完成的工作). ...

  4. 第七篇 SQL Server代理作业活动监视器

    本篇文章是SQL Server代理系列的第七篇,详细内容请参考原文 在这一系列的上一篇,你创建并配置SQL Server代理作业.每个作业有一个或多个步骤,可能包含大量的工作流.在这篇文章中,将查看作 ...

  5. 【译】第七篇 SQL Server代理作业活动监视器

    本篇文章是SQL Server代理系列的第七篇,详细内容请参考原文 在这一系列的上一篇,你创建并配置SQL Server代理作业.每个作业有一个或多个步骤,可能包含大量的工作流.在这篇文章中,将查看作 ...

  6. sqlserver 使用脚本创建Sql Server代理作业

    use master GO /* --开启sql server代理 sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_con ...

  7. SQL SERVER代理作业删除失败问题

    在SQL Server 2005上遇到了先删除已运行维护计划后,再删除代理中由其产生的作业时,提示删除失败.   DELETE 语句与 REFERENCE 约束"FK_subplan_job ...

  8. SQL Server Agent作业执行CmdExec(bat)命令报权限问题

    写了一个bat命令,定期去清理一些SQL Server的Dump文件,然后配置成SQL Server作业,作业执行时报权限错误,具体错误信息如下所示: Message Executed as user ...

  9. MSSQL SQL Server代理 作业 设置(调用存储过程)

    1.新建作业名 “生成分区文件及文件组“ 2.新建  步骤  名 “CreatePartTable” 步骤名:CreatePartTable 类型:Transact-SQL 脚本(T-SQL) 数据库 ...

随机推荐

  1. jQuery获取Table某列的值

    在写此篇博文时,发现在以前曾写过<获取DataTable选择第一行某一列值>http://www.cnblogs.com/insus/p/5434062.html . 但是与此篇所说的完全 ...

  2. js怎么样根据select的name取到值

    先看一下ASP.NET MVC的html: 在jQuery中,可以写:

  3. Webapi文件上传

    1/  multipart/form-data方式 using Abp.UI; using Abp.Web.Models; using System; using System.Collections ...

  4. kafka java.rmi.server.ExportException: Port already in use

    当你在kafka-run-class.sh中添加了export JMX_PORT=9300 开启了 jmx 后, 在使用 kafka bin/目录下的脚本时会报如下错误: java.rmi.serve ...

  5. Swift5 语言参考(七) 属性

    属性提供有关声明或类型的更多信息.Swift中有两种属性,即适用于声明的属性和适用于类型的属性. 您可以通过编写@符号后跟属性的名称以及属性接受的任何参数来指定属性: @attribute name ...

  6. HTML元素ID和JS方法名重复,JS调用失败

    HTML元素ID和JS方法名重复时,JS中的重名方法无法被找到,不能执行. 修改ID或者方法名,两者不一致即可.

  7. windows下的redis集群搭建的艰辛历程

    我是参照这两篇教程进行的操作:   1.https://www.cnblogs.com/weiqinl/p/6490372.html   (主) 2.https://blog.csdn.net/qiu ...

  8. String不得不说的那些事

    一.String.StringBuilder和StringBuffer的区别 1. String是字符串常量,StringBuilder和StringBuffer是字符串变量 String对象创建完成 ...

  9. Python相关在线文档手册地址

    Python相关: 五星推荐:http://python.usyiyi.cn/ Python 2.7官方中文文档:http://doc.iplaypy.com/python2/  英文:    htt ...

  10. c++如何解决大数组栈内存不够的问题

    在c++中,我们可以直接通过下面的方式创建一个数组: ; ; ; double phi[N][Nx][Ny]; double phi_b[N][Nx][Ny]; 但是,如果上述的Nx和Ny比较小还好说 ...