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 )
一样被调用。
也许我还可以美化一下…