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
答案 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 )
。
也许我可以稍微美化它......