1

Как часть отчета, построенного в построителе отчетов SQL Server 2012, я пытаюсь измерить количество времени, которое он «официально» взял на себя для выполнения различных задач. В моей таблице «Задача» у меня есть поле «Дата-время», заданное «Задача», поле «Время истекло», а также другие таблицы для их времени включения/выключения, из которого я могу взять данные.SQL Server: WHILE В SELECT?

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

DATEDIFF(minutes,TaskCreated,TaskResolved). 

Один из способов я нашел, чтобы сделать это, чтобы работать, сколько часов они уже взятые каждый день в виде отдельных полей, и суммирует эти поля:

Created   |Resolved   |Day1time|Day2time |Day3time |TotalTime 
14/04/2015 20:00 |16/04/2015 10:00 |01:00:00|12:00:00 |01:00:00 |14:00:00 

к сожалению, я не знаю, как долго это может занять, чтобы закончить определенную работу, чтобы объяснить это, так что я не знаю, как много полеев потребуется использовать, но код, очевидно, будет повторяющимся и, следовательно, ужасным, особенно если рабочие места могут занять месяц или больше.

Как кто-то более знакомый с языками программирования, такими как Java и C++, чем SQL, мне кажется, что это лучше сделать как функцию с созданием и разрешением в виде параметров, циклов, проходящих через каждый день, и переменной, увеличивающей этот день время простоя. К сожалению, похоже, у меня нет прав на создание даже временных функций, поэтому мне интересно, можно ли сделать цикл while для вычисления времени в выражении Select? Я пытался это сделать, но проверщик кода говорит, что он недействителен.

К сожалению у меня нет никакого кода, чтобы помочь объяснить, что я пытаюсь сделать в данный момент, так как я далеко от моей работы компьютера, но в конце концов я хотел бы что-то вроде этого:

Created   | Resolved   | Time Taken | Priority | Worker 
01/01/2015 12:00 | 01/01/2015 13:00 | 01:00:00 | A  | C Forbes 
02/03/2015 20:00 | 03/03/2015 11:00 | 03:00:00 | B  | J Flansburgh 
31/05/2015 18:50 | 01/05/2015 10:50 | 00:10:00 | D  | E Idle 
14/04/2015 20:00 | 16/04/2015 10:00 | 14:00:00 | D  | A Ng 

C Forbes - Стандартная работа - DateDiff будет работать здесь

J Flansburgh - работник заканчивается в 21:00 в будние дни, и начинается в 09:00, так что 1 час в день 1 + 2 часа на 2-й день = 3 часа всего

E Idle - заканчивается в 19:00 по воскресеньям и заканчивает работу до того, как он официально должен был стартовать в понедельник. 10 минут в воскресенье 31-й, 0 минут в понедельник 1-й = 10 минут

A Ng: Отделка в 21:00 по будням и начинается в 09:00 ... 1 час 14-го часа 12 часов по 15-й + 1 час на 16-й = 14 часов всего

Другая идея, которую я получил при вводе этого вопроса, - это сделать цикл while, взяв одну строчку за один раз из таблицы, выработав время из этой отдельной строки, а затем добавьте каждую строку в новую таблицу. Будет ли это лучше?

Заранее благодарим всех, кто пытается помочь.

ответ

0

Я бы сказал, что это зависит от содержания в вашей другой таблице, содержащей время включения/выключения. Предполагая, что вы можете выполнить соединение между двумя таблицами на основе задачи (и рабочего?) Я думаю, вы должны сделать что-то вроде:

SELECT tasks.Id, tasks.Created, tasks.Resolved, SUM(DATEDIFF(minutes,timesheet.end, timesheet.start) as [Time Taken], tasks.Priority, tasks.Worker 
FROM tasks 
    INNER JOIN timesheet on tasks.Id = timesheet.TaskId and tasks.Worker = timesheet.Worker 
GROUP BY tasks.Id, tasks.Created, tasks.Resolved, tasks.Priority, tasks.Worker 
+0

Есть действительно несколько отчетов, которые я делаю, которые имеют варианты этой проблемы. С теми, которые напрямую связаны с инженерами, все они работают по одной и той же схеме сдвига, которая по воскресеньям отличается только по-разному, поэтому я использовал случай с формулой datepart, чтобы проверить, есть ли воскресенье, и работать оттуда. Первый отчет, который я должен был do был основан на доступе в места, с таблицей, настроенной на неделю, например. ... четверг 09:00 17:00, пятница 09.00 17:00, суббота 10:00 20:00, воскресенье закрыто закрыто. На моем мобильном сейчас, жаль насчет форматирования. –