declare @i numeric(38) 
set @i=9935345 
select ltrim(@i/3600)+':'+ltrim((@i%3600)/60)+':'+ltrim(@i%60) 报错:
服务器: 消息 206,级别 16,状态 2,行 3
操作数类型冲突: int 与 void type 不兼容
服务器: 消息 206,级别 16,状态 1,行 3
操作数类型冲突: int 与 void type 不兼容
服务器: 消息 8117,级别 16,状态 1,行 3
操作数数据类型 numeric 无效(运算符 modulo)。
服务器: 消息 8117,级别 16,状态 1,行 3
操作数数据类型 numeric 无效(运算符 modulo)。
当如果@i 为bigint或int类型则可以。由于我们当前的字段类型是numeric(38),如何正确的转换时分秒的格式呢?多谢!
解决立即给分!

解决方案 »

  1.   

    declare @i numeric(38) 
    set @i=9935345 
    select ltrim(@i/3600)+':'+ltrim((@i%3600)/60)+':'+ltrim(@i%60) /*
    -----------------------------
    2759.818055:49.083333:5(1 row(s) affected)
    */
      

  2.   

    declare @i numeric(38)
    set @i=9935345
    select ltrim(cast(@i as int)/3600)+':'+ltrim((cast(@i as int)%3600)/60)+':'+ltrim(cast(@i as int)%60) 
      

  3.   

    这样肯定有问题,比如i的值超过10位时就报错了:
    服务器: 消息 8115,级别 16,状态 2,行 3
    将 expression 转换为数据类型 int 时发生算术溢出错误。
      

  4.   

    declare @i bigint
    set @i=9935345 
    select ltrim(@i/3600)+':'+ltrim((@i%3600)/60)+':'+ltrim(@i%60) 
      

  5.   

    declare @i numeric(38) 
    set @i=9935345 
    select ltrim(cast(@i as bigint)/3600)+':'+ltrim((cast(@i as bigint)%3600)/60)+':'+ltrim(cast(@i as bigint)%60) 
      

  6.   

    declare @i int
    set @i=9935345
    select ltrim(@i/3600)+':'+ltrim((@i%3600)/60)+':'+ltrim(@i%60) 
    /*
    2759:49:5
    */
      

  7.   

    declare @i numeric(38)
    set @i=9935345455555555555555555555555555
    select parsename(ltrim(@i/3600),2)+':'+parsename(ltrim(@i%3600/60),2)+':'+ltrim(@i%60) 
    --2759818182098765432098765432098:45:55
      

  8.   

    这个在sqlserver2005/2008上没问题。我的是sqlserver2000所以还是不行,报一样的错。同样这个:
    declare @i numeric(38) 
    set @i=9935345 
    select ltrim(@i/3600)+':'+ltrim((@i%3600)/60)+':'+ltrim(@i%60) 
    也是在sqlserver2005/2008上没问题。我的是sqlserver2000所以还是不行,报一样的错。
      

  9.   

    declare @i numeric(38)
    set @i=9935345455555555555555555555555555
    select ltrim(floor(@i/3600))+':'+ltrim(floor((@i%3600)/60))+':'+ltrim(@i%60)
      

  10.   

    declare @i numeric(38)
    set @i=993534545555555555555555555555555
    --select ltrim(@i/3600)+':'+ltrim((@i%3600)/60)+':'+ltrim(@i%60) 
    select 
    ltrim(cast(@i/3600  as varchar(100)))
    +':'+cast(ceiling(cast('0.'+parsename(cast(@i/3600  as varchar(100)),1) as numeric(38,10))*3600)/60 as varchar(100))
    +':'+cast(ceiling(cast('0.'+parsename(cast(@i/60  as varchar(100)),1) as numeric(38,10))*60) as varchar(100))
      

  11.   

    服务器: 消息 8115,级别 16,状态 2,行 4
    将 expression 转换为数据类型 numeric 时发生算术溢出错误。