获取数字年

时间:2018-01-24 07:14:30

标签: sql-server

在我的申请中,基于贷款流程,我请求否。来自用户的年度期限 从给定的一年我把它转换为否。几个月。

例如,如果用户给出的次数是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,然后计算它。

但我正在寻找其他更好的解决方案。

请提供您的建议。

2 个答案:

答案 0 :(得分:2)

您的问题是,值numeric(10,2)的{​​{1}}会显示为1.1。尾随零在这里没有意义......

如果您将其作为数字处理,则无法区分1.101.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