【问题标题】:Add new Calculated column; Start_DateTime plus duration (Time) as End_datetime添加新的计算列; Start_DateTime 加上持续时间(时间)作为 End_datetime
【发布时间】:2018-06-01 08:11:40
【问题描述】:

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

Run_duration 也是 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_datetime。 (即 Start_datetime + Run_duration)我的作业运行时间超过 24 小时等,因此日期也可以进入第二天。

从哪里开始?转换后还是先用原来的INT

Run_date, Run_time, Run_duration

最简单的脚本会很有帮助。

【问题讨论】:

  • OutPut 没有秒 End_date 2016-09-04 00:00:28.000 seconds 28

标签: sql sql-server datetime calculated-columns


【解决方案1】:

将持续时间转换为秒并执行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

【讨论】:

    【解决方案2】:

    您可以将“持续时间”转换为datetime,然后将其加到您的start_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
    

    输出:

    START_TIME              DURATION END_TIME
    ----------------------- -------- -----------------------
    2017-06-11 04:00:01.000 01:05:33 2017-06-11 05:05:34.000
    2017-06-18 04:00:00.000 01:05:30 2017-06-18 05:05:30.000
    2017-06-18 04:00:00.000 01:05:30 2017-06-18 05:05:30.000
    
    2018-01-28 04:00:00.000 02:15:07 2018-01-28 06:15:07.000
    2018-01-28 04:00:00.000 02:15:07 2018-01-28 06:15:07.000
    2018-02-04 04:00:00.000 02:14:29 2018-02-04 06:14:29.000
    2018-02-04 04:00:00.000 02:14:30 2018-02-04 06:14:30.000
    2018-02-11 04:00:01.000 02:18:47 2018-02-11 06:18:48.000
    2018-02-11 04:00:00.000 02:18:48 2018-02-11 06:18:48.000
    2018-02-18 04:00:01.000 02:18:18 2018-02-18 06:18:19.000
    

    【讨论】:

    • 刚刚添加 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 并且工作正常!
    • @Michael 很好 :) 请不要忘记接受它作为答案。
    • 您的解决方案是否涵盖作业运行时间超过 2 小时?请参阅页面底部的讨论 [docs.microsoft.com/en-us/sql/relational-databases/system-tables/…
    【解决方案3】:

    这对我来说似乎更容易工作

        , 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 2011-07-30
      • 1970-01-01
      • 2013-06-24
      • 2021-06-21
      • 2020-05-07
      • 2021-12-29
      相关资源
      最近更新 更多