SQL 实数转换为 Ft & In



enter code here我在5月份问过一个问题,关于如何将一个数字从一个英寸的表转换为一个英尺英寸的显示。我有两个很好的答案…

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"数的表。现在我遇到了这个错误…

"数据类型real和int在模操作符中不兼容。"

如何显示?我不能改变表的声明。其他用户也需要这些数据。

感谢这个伟大的网站。

猜完整的查询可能会有帮助,对不起。

    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

只需在表达式中包含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 )一样被调用。

也许我还可以美化一下…

最新更新