我有一系列零件号码,通常只有10个字符,但有时在开始时会包含额外的2或3个字符。除了最后5个只包含大小信息的字符之外,我想要列出所有这些部分的清单。很明显,一个简单的子字符串不起作用,据我所知,它与允许指定字符范围的rtrim()不相似。我在下面发布了我的解决方案,但我认为这有点草率,想知道是否有更好的方法?从字符串末尾开始获取长度不确定的子字符串
SELECT
DISTINCT REVERSE(SUBSTRING(REVERSE(P.ID),6,LEN(P.ID))),
P.DESCRIPTION
FROM REQUIREMENT R
INNER JOIN OPERATION O ON
R.WORKORDER_BASE_ID = O.WORKORDER_BASE_ID AND
R.WORKORDER_LOT_ID = O.WORKORDER_LOT_ID AND
R.WORKORDER_SUB_ID = O.WORKORDER_SUB_ID
INNER JOIN PART P ON
P.ID = R.PART_ID
WHERE O.RESOURCE_ID LIKE '%17%'
AND P.ID LIKE '%[0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9]'
AND P.DESCRIPTION NOT LIKE '%OBS%'
AND O.STATUS_EFF_DATE > GETDATE() - 365*2
'Left(value,len(value) - 5)'有什么问题? –
绝对没有。我不敢相信我没有想到这一点。谢谢! – mreff555
你真的应该使用DATEADD(year,-2,GETDATE())来代替你的简写数学。它更清晰,准确,不易出现数据类型错误。 http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx –