kav@94 Ответов: 1

Как суммировать рабочее время и отображать его в виде сетки


При выполнении приведенного ниже запроса я могу получить вывод в виде

Запрос-

"SELECT ( select ProcessName From ITProcess where id=it.Process) as Process,(select ITDomainName from ITdomain where id=it.Domain) as Domain,(select ITTaskDEsc from ittaskdesc where id=it.Task) as Task, " +
" CAST(DATEDIFF(Minute,it.StartDate, it.EndDate) / 60 AS VARCHAR(5)) + ' Hrs' + ':' + RIGHT('0' + CAST(DATEDIFF(Minute, it.StartDate, it.EndDate) % 60 AS VARCHAR(2)), 2)  + ' Min' AS 'WorkingTime',StartDate,Enddate FROM ITDailyTask it where Process=" + Process + ""


Код Cs-

DataTable dt = adm.GetITActivityBYProcess(ddlProcess.SelectedValue);
            if (dt.Rows.Count > 0)
            {
                grdReport.DataSource = dt;
                grdReport.DataBind();
            }
            else
            {
                grdReport.DataSource = null;
                grdReport.DataBind();
            }
        }
        else
        {
            DataTable dt = adm.GetITActivityBYProcess(ddlProcess.SelectedItem.Text);
            if (dt.Rows.Count > 0)
            {
                grdReport.DataSource = dt;
                grdReport.DataBind();
            }
            else
            {
                grdReport.DataSource = null;
                grdReport.DataBind();
            }
        }


WorkingTime

24 Ч:00 Мин
48 Часов:00 Минут

в виде сетки, но мне нужно суммировать эти два рабочих времени и отображать как 72 часа:00 минут в качестве вывода, Как я могу это сделать

Что я уже пробовал:

i had tried the above code but its not working

Jochen Arndt

Тот же вопрос уже был задан на https://www.codeproject.com/Questions/1184397/How-to-sum-up-the-working-hours-and-display-it-in с другой учетной записью пользователя.

kav@94

есть ли у этого какой-нибудь ответ

1 Ответов

Рейтинг:
1

CHill60

Первый пункт-никогда не объединяйте строки для создания sql-команд. Используйте параметризованные запросы-см. Шпаргалка по параметризации запросов-OWASP[^]

Второй момент - не используйте все эти подзапросы, это неэффективно. Вместо этого используйте соединения - см. Визуальное представление SQL-соединений[^]

Третий момент - было бы гораздо лучше иметь колонку для разницы в часах, а не varchar со встроенными "Hrs" и "Min". Однако вы можете сделать свой SQL более легким для чтения, используя (n соответствующих) подзапросов или общих табличных выражений. Следующий запрос вернет дополнительную строку результатов, содержащую общее количество часов и минут (правильная обработка минут > 60 при суммировании)

;WITH CTE AS
(
	select 
		P.ProcessName, D.ITDomainName, T.ITTaskDEsc,
		DATEDIFF(Minute,it.StartDate, it.EndDate) as DiffTime,
		StartDate,Enddate 
	FROM ITDailyTask it 
	LEFT JOIN ITProcess P on it.Process = P.id
	LEFT JOIN ITdomain D on it.Domain = D.id
	LEFT JOIN ittaskdesc T on it.Task = T.id
	where Process=@Process
	UNION
	select 'Total','','',SUM(DATEDIFF(Minute,it.StartDate, it.EndDate)) as DiffTime,
	NULL, NULL
	FROM ITDailyTask it 
	where Process=@Process
) 
SELECT ProcessName, ITDomainName, ITTaskDEsc,
	CAST(DiffTime / 60 AS VARCHAR(5)) + ' Hrs : ' + RIGHT('0' + CAST(DiffTime % 60 AS VARCHAR(2)), 2) + ' Min' AS WorkingTime,
	StartDate,Enddate 
FROM CTE