2014-10-27 37 views
0

我有這個查詢,它試圖捕獲日期(字符串)末尾不包含分號的最後11個字符。但是,當我運行腳本時,它返回的值不包含在字符串中,而且我堅持了幾天。使用子字符串解析返回錯誤的值

這裏是我的查詢

select TOP 2 a.ACCOUNT,a.GPSDATE, 
    SUBSTRING(b.smsmsg, LEN(b.smsmsg) - 10, 6) [KM2] 
    from TblGPSCur a 
    inner join GPRSIN b on a.ACCOUNT = b.SMSFR 
where exists(select * from GPRSIN b where b.SMSFR = a.ACCOUNT 
       and b.smsdt between '2014-10-27 14:00:00' and '2014-10-27 14:49:54') 

結果是這樣的

enter image description here

這是前2數據即時試圖解析

enter image description here

結果應該是277511767.8

任何人都可以告訴我,我可能在這裏做錯了嗎?

回答

0

你有你的SUBSTRING()設置不正確,應該是:

SELECT SUBSTRING(b.smsmsg, LEN(b.smsmsg) - 11, 11) 

由於起始位置是LEN(x) - 11,並且要在該點之後11個字符。

或者,你可以使用LEFT()RIGHT()

declare @SillyLongString as nvarchar(100) 
set @SillyLongString = '1234567890a;s.a.dpoiuytghjkmnbvfg,277511767.8;' 

select left(right(@SillyLongString, 12),11) 

-- outputs: 277511767.8 

這將選擇12個最右邊的字符,然後從該字符串採用的前11個字符。

添加到您的查詢:

select TOP 2 a.ACCOUNT,a.GPSDATE, 
     left(right(b.smsmsg, 12),11) [KM2] ... 
+0

你好先生,感謝您的回答,我將如何做到這一點的觸發器或stroed程序? – Dodgeball 2014-10-27 10:46:25

0

您可以使用SQL的RIGHT()功能這樣的 -

SELECT TOP 2 a.ACCOUNT 
    ,a.GPSDATE 
    RIGHT(b.smsmsg, 11) [KM2] 
FROM TblGPSCur a 
INNER JOIN GPRSIN b ON a.ACCOUNT = b.SMSFR 
WHERE EXISTS (
     SELECT * 
     FROM GPRSIN b 
     WHERE b.SMSFR = a.ACCOUNT 
      AND b.smsdt BETWEEN '2014-10-27 14:00:00' 
       AND '2014-10-27 14:49:54' 
     ) 
+0

結果是8,21000006; 不知道它在哪裏得到答案,但我認爲它做了一些事情 – Dodgeball 2014-10-27 10:45:55