0

这是我的变量

 declare @fecha varchar(50)
 set @fecha='29:14:2'
 select 
horas= CONVERT(int,SUBSTRING (@fecha,1,
 charindex(':',@fecha)-1))

**@fecha 可以有这种格式

set @fecha='9:4:2' or set @fecha='29:59:59'

我需要使用最简单的选择来获取小时=24、分钟=14、秒=2

如您所见,我只能得到一个小时,但其他两个很困惑:s

我知道我需要再次获得第一个的索引:直到其他:所以我可以得到分钟,但他让我感到困惑,我只有转换“4:”,“:”,“:1”的错误

4

3 回答 3

0

charindex允许给出搜索的起始位置

句法

CHARINDEX ( expressionToFind ,expressionToSearch [ , start_location ] )

所以你可以保存第一个冒号的位置,:稍后为第二个冒号开始一个字符

declare @fecha varchar(50) = '29:14:2'
declare @pos1 int = charindex(':', @fecha)
declare @pos2 int = charindex(':', @fecha, @pos1 + 1)
select horas = CONVERT(int, SUBSTRING(@fecha,1, @pos1 - 1)),
       minutas = CONVERT(int, SUBSTRING(@fecha, @pos1 + 1, @pos2 - @pos1 - 1))

SQLFiddle

于 2014-06-06T23:13:05.347 回答
0

我建议首先在变量中选择冒号的索引,然后基于它运行你的字符串解析。这是我在 SSMS 中使用的原始代码:

declare @fecha varchar(30)
set @fecha='9:4:2'
select
      cast(substring(@fecha, 1, HourLimiter - 1) as INT)
    , cast(substring(@fecha, HourLimiter + 1, MinuteLimiter - HourLimiter - 1) as INT)
    , cast(substring(@fecha, MinuteLimiter + 1, len(@fecha) - MinuteLimiter) as INT)
from (
    select
          charindex(':', @fecha) AS HourLimiter
        , charindex(':', @fecha, charindex(':', @fecha)+1) AS MinuteLimiter
    ) t
set @fecha='29:59:59'
select
      cast(substring(@fecha, 1, HourLimiter - 1) as INT)
    , cast(substring(@fecha, HourLimiter + 1, MinuteLimiter - HourLimiter - 1) as INT)
    , cast(substring(@fecha, MinuteLimiter + 1, len(@fecha) - MinuteLimiter) as INT)
from (
    select
          charindex(':', @fecha) AS HourLimiter
        , charindex(':', @fecha, charindex(':', @fecha)+1) AS MinuteLimiter
    ) t

我在SQLFiddle上也有一个基于表的解决方案。

于 2014-06-06T23:26:01.040 回答
0

这将做到:

declare @time varchar(32) = '29:14:2'

select hh = convert(int,
              left( @time ,
                charindex(':',@time)
                - 1
              )
            ) ,
       mm = convert(int,
              left(            right(@time,len(@time)-charindex(':',@time))   ,
                charindex(':', right(@time,len(@time)-charindex(':',@time)) )
                - 1
              )
            ) ,
       ss = convert(int ,
              right(               right(@time,len(@time)-charindex(':',@time) )   ,
                len(               right(@time,len(@time)-charindex(':',@time) ) )
                - charindex( ':' , right(@time,len(@time)-charindex(':',@time) ) )
              )
            )

如果——什么时候——你的数据不干净,它几乎肯定会崩溃。

于 2014-06-06T23:28:14.120 回答