2014-06-06 45 views
0

這是我的變量如何獲得一些子字符串在SQL中與最簡單的查詢分開的「:」?

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

** @出生日期可能有這種格式

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

我需要得到小時= 24分鐘= 14秒= 2的簡單選擇

正如你所看到的我只能得到小時,但其他兩個是困惑的:s

我知道我需要再次得到的指標,其中第一:直到其他:所以我能拿分,但他很困惑,我和我拿到的只是錯誤地把「4」,「:」,「1」

+0

請說明:29真的是一個有效的小時?傳入的字符串是否以幾小時的時間結束? –

+0

是的,這是因爲我會使用datediff(小時,29,'1900-01-01') – angel

回答

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))) 
      ) 
      ) 

如果— —你的數據不乾淨它幾乎肯定會打破。

+0

最簡單的答案 – angel

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

+0

其在那裏它困惑了我,我得到了問題,例如declare @fecha varchar(50) set @ fecha =' 29:14:2' 選擇 horas = CONVERT(INT,SUBSTRING(@日期星,1, CHARINDEX( ':',@日期星)-1)), minutos = SUBSTRING(@fecha, LEN(SUBSTRING( (':',@ fecha,1, charindex(':',@ fecha)-1) charindex(':',@ fecha)-1)), )-1 )) – angel

+0

也許我這樣做比它更困難 – angel

+0

請看更新的答案。 –

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基於表的解決方案。

相關問題