ACCESS/SQL SERVER保存软件版本号为整数类型,转成字符串
在 Access 中,若已将版本号(如1.3.15
)转换为整数形式(如10315
,即1*10000 + 3*100 + 15
),可以通过 SQL 的数学运算反向解析出原始版本号格式(主版本.次版本.修订号
)。
实现思路
通过除法和取余运算拆分整数:
- 主版本号:整数除以
10000
的商(整数部分) - 次版本号:整数除以
10000
的余数,再除以100
的商 - 修订号:整数除以
100
的余数
SQL 查询示例
假设表名为SoftwareVersions
,存储整数版本号的字段为NumericVersion
,则查询语句如下:
SELECT NumericVersion,-- 主版本号:除以10000取整数部分Int(NumericVersion / 10000) AS Major,-- 次版本号:先取除以10000的余数,再除以100取整数部分Int((NumericVersion Mod 10000) / 100) AS Minor,-- 修订号:取除以100的余数NumericVersion Mod 100 AS Patch,-- 拼接为原始版本号格式(如1.3.15)Int(NumericVersion / 10000) & "." & Int((NumericVersion Mod 10000) / 100) & "." & (NumericVersion Mod 100) AS VersionText
FROM SoftwareVersions;
说明
运算逻辑:
Int(NumericVersion / 10000)
:提取主版本(如10315 / 10000 = 1.0315
,取整数得1
)NumericVersion Mod 10000
:先获取10315 - 1*10000 = 315
,再除以100
取整数得3
(次版本)NumericVersion Mod 100
:直接获取10315
除以100
的余数15
(修订号)
拼接格式:
- 使用
&
符号连接字符串(Access 中字符串拼接运算符为&
,而非 SQL Server 的+
) - 最终得到
1.3.15
格式的版本号文本
- 使用
适用范围:
- 仅适用于按
主版本*10000 + 次版本*100 + 修订号
规则转换的整数版本号 - 若版本号规则变更(如基数调整为 1000),需同步修改除数(如
1000000
、1000
等)
- 仅适用于按
通过上述 SQL,可直接从整数形式反向解析出易读的版本号格式,方便查询和展示。
进阶方案:拆分字段法(多 INT 字段)
1. 实现逻辑
将版本号拆分为主、次、修订号字段,直接按数值排序:
CREATE TABLE SoftwareVersions (Id INT PRIMARY KEY,Major INT NOT NULL,Minor INT NOT NULL,Patch INT NOT NULL,INDEX IX_Version NONCLUSTERED (Major, Minor, Patch)
);
2. 插入与排序示例sql
-- 插入数据
INSERT INTO SoftwareVersions (Major, Minor, Patch)
VALUES (1, 3, 5),(1, 3, 51);-- 按版本号升序查询
SELECT CONCAT(Major, '.', Minor, '.', Patch) AS Version
FROM SoftwareVersions
ORDER BY Major, Minor, Patch;
-- 结果:1.3.5 → 1.3.51
3. 优点与注意事项
- 优点:排序最准确,适合复杂版本号(如包含预发布标识)。
- 注意事项:增加表字段数量,需维护字段间一致性。
数值转换法(INT/BIGINT 存储)
1. 实现逻辑
将版本号各部分乘以基数的幂次后相加:
-- 公式:major * 1000000 + minor * 1000 + patch
DECLARE @version NVARCHAR(20) = '1.3.51';
SELECT CAST(PARSENAME(@version, 3) AS INT) * 1000000 +CAST(PARSENAME(@version, 2) AS INT) * 1000 +CAST(PARSENAME(@version, 1) AS INT) AS NumericVersion;
-- 输出:10351
2. 表结构设计
CREATE TABLE SoftwareVersions (Id INT PRIMARY KEY,Version NVARCHAR(20) NOT NULL,NumericVersion INT NOT NULL, -- 存储转换后的数值INDEX IX_NumericVersion NONCLUSTERED (NumericVersion)
);
插入与排序示例sql
-- 插入数据
INSERT INTO SoftwareVersions (Version, NumericVersion)
VALUES ('1.3.5', 10305),('1.3.51', 10351);-- 按版本号升序查询
SELECT Version
FROM SoftwareVersions
ORDER BY NumericVersion;
-- 结果:1.3.5 → 1.3.51