首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Server :转换日期和/或时间时,字符串超过12 or的字符的转换失败

Server :转换日期和/或时间时,字符串超过12 or的字符的转换失败
EN

Stack Overflow用户
提问于 2018-07-13 15:15:49
回答 3查看 168关注 0票数 0

在过去的几天里,我的代码已经工作了,但是今天它出现了以下错误:

从字符串转换日期和/或时间时,转换失败

这是我的代码:

代码语言:javascript
运行
复制
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)。

编辑-下面是我的代码的一个更好的例子,它使用了其中一个建议的答案:

代码语言:javascript
运行
复制
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 

谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-13 15:27:11

如果您试图从HHMMSS格式的字符串中计算开始时间,那么这个方法在我看来要简单得多:

代码语言:javascript
运行
复制
select cast(stuff(stuff(right('0000000' + str, 6), 5, 0, ':'), 3, 0, ':') as time)
from (values ('120609'), ('0'), ('1001')) v(str)
票数 0
EN

Stack Overflow用户

发布于 2018-07-13 15:47:01

在您的示例中,问题是要转换的字符串:"12:20:60“--时间类型的会话失败。

代码语言:javascript
运行
复制
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?

最好的解决办法应该是戈登提出的方案。

票数 0
EN

Stack Overflow用户

发布于 2018-07-13 16:03:08

这对我来说很管用:

代码语言:javascript
运行
复制
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语句,请执行以下操作:

代码语言:javascript
运行
复制
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_result
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51328248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档