在过去的几天里,我的代码已经工作了,但是今天它出现了以下错误:
从字符串转换日期和/或时间时,转换失败
这是我的代码:
DECLARE @run_time INT
DECLARE @run_duration INT 
SET @run_time = '120609'
SET @run_duration = '2600'
SELECT
    h.step_id,
    CAST(j.[name] AS VARCHAR) as JobName,
    h.step_name,
    CAST(REPLACE(LEFT(CAST(case 
                              when len(@run_time) = 1 then '00:00:0' + cast(@run_time as varchar)
                              when len(@run_time) = 2 then '00:00:' + cast(@run_time as varchar)
                              when len(@run_time) = 3 then '00:0' + cast(left(@run_time,1) as varchar) + ':' + cast(right(@run_time,2) as varchar)
                              when len(@run_time) = 4 then '00:' + cast(left(@run_time,2) as varchar) + ':' + cast(right(@run_time,2) as varchar)
                              when len(@run_time) = 5 then '0' + cast(left(@run_time,1) as varchar) + ':' + SUBSTRING(CAST(@run_time AS VARCHAR),    2, 2) + ':' + SUBSTRING(CAST(@run_time AS VARCHAR), 4,2)
                              when len(@run_time) = 6 then cast(left(@run_time,2) as varchar) + ':' + SUBSTRING(CAST(@run_time AS VARCHAR), 2,2) + ':' + SUBSTRING(CAST(@run_time AS VARCHAR), 4,2)
                           END AS TIME), 8), ':', '') AS INT) StartTime我发现唯一出现错误的时间是当run_time超过120000 (中午12点)时,因此我以前从未注意到它,因为代理作业在凌晨3点运行。这不应该是一个未来的问题,但以防万一,我想解决这个问题。我在任何地方都找不到类似于我的代码的例子。不幸的是,像这样转换结果是我在SSRS中获得图形的唯一方法。(INT > VARCHAR > TIME > INT)。
编辑-下面是我的代码的一个更好的例子,它使用了其中一个建议的答案:
SELECT
    h.step_id,
    CAST(j.[name] AS VARCHAR) as JobName,
    h.step_name,
    CAST(stuff(stuff(right('0000000' + h.run_time, 6), 5, 0, ':'), 3, 0, ':') as time)
FROM
    msdb.dbo.sysjobs j 
    INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id 谢谢,
发布于 2018-07-13 15:27:11
如果您试图从HHMMSS格式的字符串中计算开始时间,那么这个方法在我看来要简单得多:
select cast(stuff(stuff(right('0000000' + str, 6), 5, 0, ':'), 3, 0, ':') as time)
from (values ('120609'), ('0'), ('1001')) v(str)发布于 2018-07-13 15:47:01
在您的示例中,问题是要转换的字符串:"12:20:60“--时间类型的会话失败。
DECLARE @run_time INT
DECLARE @run_duration INT 
SET @run_time = '120609'
SET @run_duration = '2600'
SELECT
    -- h.step_id,
    --CAST(j.[name] AS VARCHAR) as JobName,
    -- h.step_name,
    --CAST(REPLACE(LEFT(CAST(
    case 
        when len(@run_time) = 1 then '00:00:0' + cast(@run_time as varchar)
        when len(@run_time) = 2 then '00:00:' + cast(@run_time as varchar)
        when len(@run_time) = 3 then '00:0' + cast(left(@run_time,1) as varchar) + ':' + cast(right(@run_time,2) as varchar)
        when len(@run_time) = 4 then '00:' + cast(left(@run_time,2) as varchar) + ':' + cast(right(@run_time,2) as varchar)
        when len(@run_time) = 5 then '0' + cast(left(@run_time,1) as varchar) + ':' + SUBSTRING(CAST(@run_time AS VARCHAR), 2,2) + ':' + SUBSTRING(CAST(@run_time AS VARCHAR), 4,2)
        when len(@run_time) = 6 then cast(left(@run_time,2) as varchar) + ':' + SUBSTRING(CAST(@run_time AS VARCHAR), 2,2) + ':' + SUBSTRING(CAST(@run_time AS VARCHAR), 4,2)
    END ,
    SUBSTRING(CAST(@run_time AS VARCHAR), 4,2)
    --AS TIME)
    --,8), ':', '') AS INT) StartTime你看过了吗?How to convert an integer (time) to HH:MM:SS::00 in SQL Server 2008?
最好的解决办法应该是戈登提出的方案。
发布于 2018-07-13 16:03:08
这对我来说很管用:
SELECT
    h.step_id,
    CAST(j.[name] AS VARCHAR) as JobName,
    h.step_name,
    -- CAST(stuff(stuff(right('0000000' + h.run_time, 6), 5, 0, ':'), 3, 0, ':') as time)
     (h.run_time / 1000000) % 100 as hour,
       (h.run_time / 10000) % 100 as minute,
       (h.run_time / 100) % 100 as second,
       (h.run_time % 100) * 10 as millisecond,
       dateadd(hour, (h.run_time / 1000000) % 100, dateadd(minute, (h.run_time / 10000) % 100, dateadd(second, (h.run_time / 100) % 100, dateadd(millisecond, (h.run_time % 100) * 10, cast('00:00:00' as time(2)))))) 
FROM
    msdb.dbo.sysjobs j 
    INNER JOIN msdb.dbo.sysjobhistory h ON j.job_id = h.job_id 顺便说一句,演员们也给我带来了错误。
如果不想使用select语句,请执行以下操作:
DECLARE @run_time INT
DECLARE @time_result TIME
SET @run_time = '120609'
SET @time_result = dateadd(hour, (@run_time / 1000000) % 100, dateadd(minute, (@run_time / 10000) % 100, dateadd(second, (@run_time / 100) % 100, dateadd(millisecond, (@run_time % 100) * 10, cast('00:00:00' as time(2)))))) 
select @time_resulthttps://stackoverflow.com/questions/51328248
复制相似问题