在我的申请中,基于贷款流程,我请求否。来自用户的年度期限 从给定的一年我把它转换为否。几个月。
例如,如果用户给出的次数是1.1,那么根据查询,
中没有计算月数Declare @repayment_in_yrs numeric(10,2)
SET @repayment_in_yrs = 1.1
select ((@repayment_in_yrs % 1)*100)/10
Select ((@repayment_in_yrs - (@repayment_in_yrs %1)) * 12)
Select (((@repayment_in_yrs % 1)*100)/10) + ((@repayment_in_yrs - (@repayment_in_yrs %1)) * 12)
输出为12 + 1 = 13个月。
如果我将用户输入设为1.10,则结果应为12 + 10 = 22个月。 但输出是13。
我可以使用sbustring函数将其拆分为1,10,然后计算它。
但我正在寻找其他更好的解决方案。
请提供您的建议。
答案 0 :(得分:2)
您的问题是,值numeric(10,2)
的{{1}}会显示为1.1
。尾随零在这里没有意义......
如果您将其作为数字处理,则无法区分1.10
和1.1
...
所以我假设你的值在某处以字符串形式存在。在这种情况下,您可以使用XML技巧分别获取第一部分和第二部分:
1.10
结果
DECLARE @testValues TABLE(Val VARCHAR(10), ShouldBe VARCHAR(100));
INSERT INTO @testValues VALUES('1','1 year')
,('1.0','1 year')
,('1.1','1 year 1 month')
,('1.10','1 year 10 months')
,('.1','1 month')
,('0.1','one month')
,('3.12','3 years 12 months (one more year)');
SELECT tv.*
, ISNULL(Part.value('/x[1]/text()[1]','int'),0) * 12
+ ISNULL(Part.value('/x[2]/text()[1]','int'),0) AS ComputedMonths
FROM @testValues AS tv
CROSS APPLY(SELECT CAST('<x>' + REPLACE(tv.Val,'.','</x><x>') + '</x>' AS XML)) AS Splittable(Part);
答案 1 :(得分:0)
试试这个
DECLARE @repayment_in_yrs NUMERIC(10,2) = 1.11
SELECT
(CAST(@repayment_in_yrs AS INT)*12)+
CASE
WHEN PARSENAME(@repayment_in_yrs,1) IN (11,12)
THEN PARSENAME(@repayment_in_yrs,1)
ELSE PARSENAME(@repayment_in_yrs,1)/10 END
但这不适用于1.1和1.10。
因此,在这种情况下,您可以尝试从DECIMAL将数据类型更改为VARCHAR。并尝试以下
DECLARE @repayment_in_yrs VARCHAR(20) = 1.1
;WITH CTE
AS
(
SELECT
NumVal = CAST(@repayment_in_yrs AS DECIMAL(10,2)),
CharVal = CAST(@repayment_in_yrs AS VARCHAR(20))
)
SELECT
(CAST(NumVal AS INT)*12)+
CASE
WHEN PARSENAME(CharVal,1) IN (10,11,12)
THEN PARSENAME(CharVal,1)
ELSE PARSENAME(NumVal,1)/10 END
FROM CTE