2014-10-27 75 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