我尝试使用SQL Server比较程序集版本,但是可以返回多个版本,我需要它是六位数格式。
例如,程序集版本2.00.0001
我需要将其作为2.0.1
返回。
可能会有像1.01.0031
这样的版本,我需要1.1.31
。
这有效,但是有更好的方法吗?
select left(left([output],9),1)+'.'+substring(left([output],9),3,1)+'.'+substring(right(left([output],9),1),1,1)
答案 0 :(得分:5)
使用ParseName
功能,您可以实现此目的。试试这个 -
DECLARE @val VARCHAR(100) = '01.10.0031'
SELECT CONVERT(VARCHAR, CONVERT(INT, PARSENAME(@val, 3))) + '.' +
CONVERT(VARCHAR, CONVERT(INT, PARSENAME(@val, 2))) + '.' +
CONVERT(VARCHAR, CONVERT(INT, PARSENAME(@val, 1)))
<强>结果强>
1.10.31
答案 1 :(得分:2)
对于数量有限的零,您可以将.0
替换为.
:
select replace(replace(replace([output], '.00', '.'), '.0', '.'), '..', '.0.')
这有点像黑客,但它相对简单。
答案 2 :(得分:1)
由于该模式始终是固定的,因此您可以使用substring
和cast
来执行此操作。
select substring(col,1,1) + '.'
cast(cast(substring(col,3,2) as int) as varchar(2)) + '.'
cast(cast(substring(col,6,4) as int) as varchar(4))
from tablename
答案 3 :(得分:0)
这是一个动态解决方案,可以使用任何格式,前提是没有alpha和'。'是分离者。
Create Function [dbo].[SplitString] ( @stringToSplit VARCHAR(MAX) )
RETURNS
varchar(MAX)
AS
BEGIN
DECLARE @name VARCHAR(MAX)
DECLARE @pos INT
Declare @Return Varchar(MAX) = ''
WHILE CHARINDEX('.', @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX('.', @stringToSplit)
SELECT @name = Convert(Varchar(MAX), Convert(Int, SUBSTRING(@stringToSplit, 1, @pos-1)))
Set @Return = @Return + @name + '.'
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
END
RETURN @Return + Convert(Varchar(MAX), Convert(Int, @stringToSplit))
END
Declare @ver Varchar(100) = '7.00.0001'
Select dbo.splitstring(@ver)
答案 4 :(得分:0)
我认为只要模式包含两个小数点并且每个位置都应该处理任意数量的零,这应该有效
DECLARE @version VARCHAR(19)
SET @version = '2.00.0001'
SELECT
CAST(CAST(SUBSTRING(@version,1,CHARINDEX('.',@version,1)-1) AS INT) AS VARCHAR(5)) + '.'+
CAST(CAST(SUBSTRING(@version,CHARINDEX('.',@version,1)+1,CHARINDEX('.',@version,CHARINDEX('.',@version,1) + 1)-CHARINDEX('.',@version,1)-1) AS INT) AS VARCHAR(5)) + '.' +
CAST(CAST(SUBSTRING(@version,CHARINDEX('.',@version,CHARINDEX('.',@version,1) + 1)+1,LEN(@version)) AS INT) AS VARCHAR(5))