У меня возникла проблема с запросом.
Сценарий таков: у меня есть показатель эффективности c, который заполняется в представлении, принимая входные данные из другого представления. Этот расчет использует GETUTCDATE()
, и я просто корректирую свой часовой пояс. Я рассчитываю эффективность, используя значение столбца «BuildTime» в зависимости от того, сколько времени прошло с 7:00 утра текущего дня (например, если с 7:00 прошло 120 минут, а «BuildTime» равно 120 минутам, эффективность равна 100%). Я также использую функцию CASE
, чтобы вычислять только текущее время между часами работы (7:00 - 15:30)
Ниже приведен код:
SELECT
md.Operator,
CASE
WHEN DATEADD(HOUR, -6, GETUTCDATE()) > CONVERT(DATETIME, CONVERT(DATE, DATEADD(HOUR, -6, GETUTCDATE()))) + '7:00' AND GETDATE() < CONVERT(DATETIME, CONVERT(DATE, DATEADD(HOUR, -6, GETUTCDATE()))) + '15:30' THEN
(SUM(isNull(md.TotalTime, 0)) + SUM(isNull(md.DelTime, 0))) * 1.0 / DATEDIFF(MINUTE, CONVERT(DATETIME, CONVERT(DATE, DATEADD(HOUR, -6, GETUTCDATE()))) + '7:00' , DATEADD(HOUR, -6, GETUTCDATE())) * 100.0
ELSE (SUM(isNull(md.TotalTime, 0)) + SUM(isNull(md.DelTime, 0))) / 435 * 100.0
END
AS OpEfficiency
FROM [Booms MES Master Data] as md
WHERE md.[Date] = CONVERT(varchar(50), DATEADD(HOUR, -6, GETUTCDATE()), 101)
GROUP BY md.Operator
На данный момент Этот код занимает несколько секунд для запуска. Мне интересно, где проблема лежит в коде? Я преобразовываю слишком много операторов или это проблема с вложенной функцией if?