2015-08-21 2 views
1

enter code here В мае я задал вопрос о том, как преобразовать число из таблицы в дюймах, например, 300,9 на дисплей Ft 'In. У меня есть два очень хороших ответа. .SQL Real number convert to 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 

Оба работал хорошо, пока я не наткнулся на стол, что дюйм объявлен как «реальный» номер. Теперь я столкнулся с этой ошибкой ...

«типы данных в реальных и INT несовместимы в операторе modulo. "

Как я могу отобразить это? Я не могу изменить таблицу de clarations. Другие пользователи также нуждаются в этих данных.

Спасибо и Куддос за отличный сайт.

Удовлетворение полного запроса может помочь, извините.

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

Можете ли вы показать ссылку на предыдущий вопрос? – Marusyk

+0

Можете ли вы предоставить какую-нибудь образец данных hat приводит к вашему сообщению об ошибке? – cars10m

+0

Предыдущий вопрос-- [http://stackoverflow.com/questions/30078773/converting-a-number-to-feet-inches] – Obfuscated

ответ

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." 

Это превратит первое значение (футы) в целое число, а второй один (в) будет по-прежнему показывать все цифры после запятой точка.

UPDATE

Когда я побежал выбрать из таблицы #tmp я получил ту же ошибку, как ОП. Я модифицируется и в конечном итоге с этим:

Это так некрасиво, как ад, в настоящее время, но, по крайней мере он работает сейчас смотрите здесь 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)[email protected][email protected]%12 AS varchar(20))+'"' 
END 

будет делать трюк, который будет называться как dbo.ftinstr(floatval).

Возможно, я смогу украсить его еще немного ...

+0

Пробовал, что ... CONVERT (VARCHAR (20), floor (finlength/12)) + '' '' + CONVERT (VARCHAR (20), Floor (finlength% 12)) + '"' как FinishLen ... То же самое. – Obfuscated

+0

Ну, он * работает * здесь: [sql-demo] (http: //data.stackexchange.com/stackoverflow/query/353414/foot-inch) ... – cars10m

+0

Я не хочу сомневаться в вашем ответе, я очень благодарен вам за помощь. Думаю, мне нужно выяснить, как получить мои номера в первой строке вашего утверждения ... 'С tst as (SELECT 13.7 finlength UNION ALL SELECT 123)'. – Obfuscated