SQL实数转换为Ft&在

时间:2015-08-21 14:36:38

标签: sql sql-server-2008

enter code here我在五月问了一个问题,关于如何将一个数字从一个英寸的表格转换成300.9到一个Ft'In“显示。我得到了两个非常好的答案......

CONVERT(VARCHAR(20),finlength /12) + '''' + CONVERT(VARCHAR(20),finlength %12)+'"' as FinishLen

replace(replace('<feet>'' <inches>', '<feet>', FinLength / 12), '<inches>', FinLength % 12) as FinishLen

两者都运作良好,直到我遇到一个表格,英寸被宣布为“真实”数字。现在我遇到了这个错误......

“数据类型real和int在模运算符中不兼容。”

我该如何显示?我无法更改表声明。其他用户也需要这些数据。

感谢和Kuddos这个伟大的网站。

猜猜完整的查询可能会有所帮助,抱歉。

    SELECT TOP 1000 ProdWkYr
          ,Product
          ,Grade
          ,CONVERT(VARCHAR(20),finlength /12) + '''' + CONVERT(VARCHAR(20),finlength %12)+'"' as FinishLen
          ,BlmWeight
          ,BlmsNeeded
          ,BlmFootWgt
      FROM NYS2MiscOrderInfo
      where ProdWkYr = 3215

  order by product, Grade

1 个答案:

答案 0 :(得分:2)

只需在表达式中添加floor(),例如

-- -------------------------------------------------------------------
-- set-up some test data using a CTE:
WITH tst as ( SELECT 13.7 finlength UNION ALL SELECT 123 )
-- alternatively: generate a table [tst] with a single column [finlength] 
-- -------------------------------------------------------------------

SELECT CONVERT(VARCHAR(20),FLOOR(finlength / 12)) + '''' 
     + CONVERT(VARCHAR(20),finlength % 12)+'"' as FinishLen
FROM tst

-- results:
FinishLen
1'1.70"
10'3."

这会将第一个(ft)值转换为整数,而第二个(in)仍将显示小数点后的所有数字。

<强>更新

当我从#tmp表中运行select时,我得到了与OP相同的错误。然后我修改并最终得到了这个:

现在一样丑陋,但至少现在可以使用,请看这里SQL Demo

create table #tst (finlength float);
INSERT INTO #tst VALUES (13.7),(123.),(300.9);

SELECT CONVERT(VARCHAR(20),FLOOR(finlength / 12)) + '''' -- ft
      +CONVERT(VARCHAR(20),finlength-FLOOR(finlength)    -- in: fractional part
      +CAST(FLOOR(finlength) as int) %12)+'"'            -- in: integer part
as FinishLen 
FROM #tst

请注意:该公式将为正值返回合理的结果。对于“负距离”,需要进一步改变。如果在不同的地方需要类似的输出,那么UDF在这里是有意义的。类似的东西:

CREATE FUNCTION ftinstr(@v float) RETURNS varchar(32) BEGIN
 DECLARE @l int;
 SELECT @l=FLOOR(ABS(@v));
 RETURN CAST(SIGN(@v)*(@l/12) AS varchar(6))+''''
       +CAST( ABS(@v)-@l+@l%12 AS varchar(20))+'"'
END

可以做到这一点,被称为dbo.ftinstr( floatval )

也许我可以稍微美化它......