如何在SQL Server中计算并以YY/MM格式显示经验月数?
在SQL Server中计算并格式化总经验月数为YY/MM格式(处理NULL、0等特殊情况)
刚好碰到过类似的需求,咱们直接上解决方案,把各种特殊情况都覆盖到:
首先,我们需要把存储的经验月数(可能是NULL、0或者任意正整数)转换成YY/MM的标准格式,比如40个月对应03/04,133个月对应11/01,NULL值可以显示为N/A,0个月显示为00/00。
完整测试代码
-- 创建临时表存储测试数据 CREATE TABLE #temp (Min_Expr_InMonths INT, Max_Expr_InMonths INT) INSERT INTO #temp VALUES (40, 98) INSERT INTO #temp VALUES (NULL, NULL) INSERT INTO #temp VALUES (0, 0) INSERT INTO #temp VALUES (133, 145) -- 完善后的查询语句,处理所有特殊情况 SELECT Min_Expr_InMonths AS 原始最小月数, -- 处理最小经验月数的格式化 CASE WHEN Min_Expr_InMonths IS NULL THEN 'N/A' ELSE RIGHT('00' + CAST(FLOOR(Min_Expr_InMonths / 12.0) AS VARCHAR), 2) + '/' + RIGHT('00' + CAST(Min_Expr_InMonths % 12 AS VARCHAR), 2) END AS 格式化最小经验(YY/MM), Max_Expr_InMonths AS 原始最大月数, -- 处理最大经验月数的格式化 CASE WHEN Max_Expr_InMonths IS NULL THEN 'N/A' ELSE RIGHT('00' + CAST(FLOOR(Max_Expr_InMonths / 12.0) AS VARCHAR), 2) + '/' + RIGHT('00' + CAST(Max_Expr_InMonths % 12 AS VARCHAR), 2) END AS 格式化最大经验(YY/MM) FROM #temp -- 清理临时表 DROP TABLE #temp
关键逻辑说明
- NULL值处理:用
CASE WHEN判断如果原始值是NULL,直接返回N/A(你也可以改成空字符串或者其他标记,按需调整) - 年份格式化:用
FLOOR(Months / 12.0)确保年份是整数(避免整数除法的截断问题),再用RIGHT('00' + ..., 2)自动补零,不管年份是个位数还是两位数,都能输出两位格式 - 月份格式化:用
Months % 12计算剩余月份,同样用RIGHT('00' + ..., 2)补零,比如0个月就显示00,4个月显示04 - 0值处理:0个月会被转换成
00/00,完全符合格式要求
测试结果
| 原始最小月数 | 格式化最小经验(YY/MM) | 原始最大月数 | 格式化最大经验(YY/MM) |
|---|---|---|---|
| 40 | 03/04 | 98 | 08/02 |
| NULL | N/A | NULL | N/A |
| 0 | 00/00 | 0 | 00/00 |
| 133 | 11/01 | 145 | 12/01 |
这样不管是哪种情况都能完美处理啦~
内容的提问来源于stack exchange,提问作者Prasanth Kumar Vinakota
相关产品推荐
相关产品推荐

