Как часть отчета, построенного в построителе отчетов 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, взяв одну строчку за один раз из таблицы, выработав время из этой отдельной строки, а затем добавьте каждую строку в новую таблицу. Будет ли это лучше?
Заранее благодарим всех, кто пытается помочь.
Есть действительно несколько отчетов, которые я делаю, которые имеют варианты этой проблемы. С теми, которые напрямую связаны с инженерами, все они работают по одной и той же схеме сдвига, которая по воскресеньям отличается только по-разному, поэтому я использовал случай с формулой datepart, чтобы проверить, есть ли воскресенье, и работать оттуда. Первый отчет, который я должен был do был основан на доступе в места, с таблицей, настроенной на неделю, например. ... четверг 09:00 17:00, пятница 09.00 17:00, суббота 10:00 20:00, воскресенье закрыто закрыто. На моем мобильном сейчас, жаль насчет форматирования. –