Sql 添加新的计算列;开始日期时间加上持续时间(时间)作为结束日期时间

Sql 添加新的计算列;开始日期时间加上持续时间(时间)作为结束日期时间,sql,sql-server,datetime,calculated-columns,Sql,Sql Server,Datetime,Calculated Columns,sqlserver代理作业;在msdb中,您有dbo.sysjobhistory,它以INT类型为您提供Run_date和Run_time,可以使用dbo.agent_Datetime轻松地将其转换为Start_Datetime。我得到:2018-05-17 01:13:09.240 运行时间也为INT。我用 STUFF(STUFF(RIGHT('000000' + CAST(jh.run_duration AS VARCHAR(6)), 6), 5, 0, ':'), 3, 0, ':') A

sqlserver代理作业;在msdb中,您有dbo.sysjobhistory,它以INT类型为您提供Run_date和Run_time,可以使用dbo.agent_Datetime轻松地将其转换为Start_Datetime。我得到:2018-05-17 01:13:09.240

运行时间也为INT。我用

STUFF(STUFF(RIGHT('000000' + CAST(jh.run_duration AS VARCHAR(6)), 6), 5, 0, ':'), 3, 0, ':') AS'Time_HH:MM:SS'
我得到27:31:20

我想计算一个新列作为
End\u datetime
。(即开始日期时间+运行持续时间)我的作业运行超过24小时等,因此日期也可以进入第二天

从哪里开始?转换后或从原始
INT
列开始

Run_date, Run_time, Run_duration
最简单的脚本将是最有用的

您可以将“持续时间”强制转换为
datetime
,然后将其相加到您的
开始日期

select  dbo.agent_datetime(run_date, run_time) START_TIME,
        STUFF(STUFF(RIGHT('000000' + CAST ( run_duration AS VARCHAR(6 ) ) ,6),5,0,':'),3,0,':') DURATION,
        CONVERT(datetime, dbo.agent_datetime(run_date, run_time)) +
        CONVERT(datetime, STUFF(STUFF(RIGHT('000000' + CAST ( run_duration AS VARCHAR(6 ) ) ,6),5,0,':'),3,0,':') ) AS END_TIME

from sysjobhistory
输出:

您可以将“持续时间”强制转换为
datetime
,然后将其相加到您的
start\u date

select  dbo.agent_datetime(run_date, run_time) START_TIME,
        STUFF(STUFF(RIGHT('000000' + CAST ( run_duration AS VARCHAR(6 ) ) ,6),5,0,':'),3,0,':') DURATION,
        CONVERT(datetime, dbo.agent_datetime(run_date, run_time)) +
        CONVERT(datetime, STUFF(STUFF(RIGHT('000000' + CAST ( run_duration AS VARCHAR(6 ) ) ,6),5,0,':'),3,0,':') ) AS END_TIME

from sysjobhistory
输出:


将持续时间转换为秒并执行
Dateadd

 SELECT convert(DATETIME, convert(VARCHAR(10), run_date))
        ,run_duration % 100 seconds
        ,DATEADD(ss, (run_duration % 100), convert(DATETIME, convert(VARCHAR(10), run_date))) 
              End_date
    FROM dbo.sysjobhistory

将持续时间转换为秒并执行
Dateadd

 SELECT convert(DATETIME, convert(VARCHAR(10), run_date))
        ,run_duration % 100 seconds
        ,DATEADD(ss, (run_duration % 100), convert(DATETIME, convert(VARCHAR(10), run_date))) 
              End_date
    FROM dbo.sysjobhistory

这对我来说似乎更容易

    , DATEADD(SECOND, run_duration / 10000 * 3600 + run_duration % 10000 / 100 * 60 + run_duration % 100, 
msdb.dbo.agent_datetime(jh.run_date, jh.run_time)) AS End_DateTime

这对我来说似乎更容易

    , DATEADD(SECOND, run_duration / 10000 * 3600 + run_duration % 10000 / 100 * 60 + run_duration % 100, 
msdb.dbo.agent_datetime(jh.run_date, jh.run_time)) AS End_DateTime

输出没有秒结束日期2016-09-04 00:00:28.000秒输出没有秒结束日期2016-09-04 00:00:28.000秒28刚刚添加了转换(datetime,dbo.agent_datetime(run_date,run_time))+转换(datetime,STUFF(右('000000'+转换(run_duration作为VARCHAR(6)),6),5,0',:'),3,0',:'))作为结束时间和工作的好@迈克尔:这很好:)请别忘了接受它作为答案。你的解决方案是否涵盖一份工作运行超过2小时的情况?请参阅第页底部的讨论[Just Addd CONVERT(datetime,dbo.agent_datetime(run_date,run_time))+CONVERT(datetime,STUFF(STUFF)(右('000000'+CAST(run_duration AS VARCHAR(6)),6),5,0',:',3,0',:'))作为结束时间和工作时间,很好!@Michael,这很好:)请不要忘记接受它作为答案。您的解决方案是否涵盖了一项工作运行超过2小时的情况?请参阅第页底部的讨论[