У меня есть функция SQL, которая собирает время работы из нескольких записей и использует STUFF(CAST AS VARCHAR(20)) для объединения их в один столбец временной таблицы.

Моя проблема в том, что трудозатраты в моей таблице указаны в часах и округлены до 7 десятичных знаков, я хочу преобразовать эти значения в минуты и округлить их до 2 десятичных знаков, прежде чем вставлять их в мою временную таблицу.

Обновление: Забыл упомянуть, я использую SQL Server 2008 R2

Вот мой код.

  @site nvarchar(20)
  ,@item nvarchar(30)
  ,@enviro nvarchar(30))
RETURNS nvarchar(MAX)
AS
BEGIN
    DECLARE @LbrHours AS nvarchar(MAX) = ''

    IF @enviro = 'Test'
    BEGIN
        IF @site = 'Arborg'
        BEGIN
            SET @LbrHours = STUFF((SELECT ',' + CAST(jrt.run_lbr_hrs AS VARCHAR(20))
                            FROM Arborg_Test_App.dbo.jobroute AS jbr
                                INNER JOIN Arborg_Test_App.dbo.job AS job
                                    ON job.job = jbr.job 
                                    AND job.suffix = jbr.suffix
                                INNER JOIN Arborg_Test_App.dbo.item AS itm
                                    ON itm.job = job.job
                                INNER JOIN Arborg_Test_App.dbo.jrt_sch AS jsh
                                    ON jbr.job = jsh.job 
                                    AND jbr.suffix = jsh.suffix 
                                    AND jbr.oper_num = jsh.oper_num
                                LEFT OUTER JOIN Arborg_Test_App.dbo.jrt_sch AS jrt
                                    ON jbr.job = jrt.job
                                    AND jbr.suffix = jrt.suffix
                                    AND jbr.oper_num = jrt.oper_num
                            WHERE  job.suffix = '0' and job.type = 'S' AND itm.item IS NOT NULL
                                AND itm.item = @item 
                                AND jbr.suffix = CASE -- Return Standard cost if Standard Operation exist, else return current cost
                                                    WHEN itm.cost_type = 'S'
                                                        THEN '1' -- '1' for standard operation
                                                    ELSE '0' -- '0' for current operations
                                                  END
                            ORDER BY itm.item, jbr.oper_num
                            FOR XML PATH('')), 1, 1, '')
            END 
        END

    RETURN @LbrHours
END

jrt.run_lbr_hrs - это столбец, который содержит рабочее время в часах в нашей таблице ERP. Как я могу умножить это на 60 и округлить до двух знаков после запятой в моем существующем STUFF(CASE AS NVARCHAR)?

1
Cornelius 21 Июн 2014 в 00:29
1
Похоже на SQL Server из синтаксиса (использование функций FOR XML PATH и STUFF())
 – 
Rahul
21 Июн 2014 в 00:40
Да SQL 2008 R2. Извини, это был сумасшедший день.
 – 
Cornelius
21 Июн 2014 в 00:50

2 ответа

Лучший ответ

CAST в десятичное с двумя значениями после точки, а затем в varchar

CAST(CAST(jrt.run_lbr_hrs * 60 AS DECIMAL(10, 2)) AS VARCHAR(20))

Измените десятичный размер на то, что вам нужно

2
Serpiton 21 Июн 2014 в 01:08
Спасибо за ответ, я использовал CAST(CAST(jrt.run_lbr_hrs * 60 AS DECIMAL(7, 2) AS VARCHAR(20))), но получаю "Неверный синтаксис рядом с ключевым словом "AS"" для этой строки.
 – 
Cornelius
21 Июн 2014 в 01:03

Попробуйте это Str (jrt.run_lbr_hrs * 60, 2)

0
WarAnt 21 Июн 2014 в 01:21
Не могли бы вы добавить объяснение, почему ваше решение работает?
 – 
hichris123
21 Июн 2014 в 01:39
Это стандартная функция сервера mssql, в лучшем случае вы можете получить небольшое изменение кода на str (jrt.run_lbr_hrs * 60, 10, 2)
 – 
WarAnt
21 Июн 2014 в 01:48