解析子字符串返回错误的值

时间:2014-10-27 09:38:14

标签: sql sql-server parsing

我有这个查询,它试图捕获日期末尾排除最后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

谁能告诉我在这个问题上我可能做错了什么?

2 个答案:

答案 0 :(得分: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] ...

答案 1 :(得分: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'
        )