Вычисление прошедшего рабочего времени между 2 датами и временами

Чтобы установить фон всего своего тела, просто добавьте следующее в свой css

html {
    background-color: black;
}

body {
    background-color: white;
}

Checkout https://developer.mozilla.org/en-US/docs/Web/CSS / CSS_Selectors для получения дополнительной информации о CSS-селекторах различного вида и о том, как их использовать.

Селектор типа CSS сопоставляет элементы по имени узла. Другими словами, он выбирает все элементы данного типа в документе.

Синтаксис

element { style properties }
blockquote>

6
задан Dan 26 September 2008 в 19:51
поделиться

8 ответов

Прежде чем Вы начнете оптимизировать его, зададите себе два вопроса.

a) Это работает?

b) Это слишком медленно?

Только если ответ на оба вопроса - "да", Вы готовы начать оптимизировать.

Кроме этого

  • только необходимо волноваться о минутах и часах в день запуска и день конца. Прошедшие дни, очевидно, будут целыми 9/9.5 часами, если они не будут праздниками или выходные
  • Никакая потребность проверить день выходных дней, чтобы видеть, является ли это праздник

Вот то, как я сделал бы это

// Normalise start and end    
while start.day is weekend or holiday, start.day++, start.time = 0.00am
    if start.day is monday,
        start.time = max(start.time, 8am)
    else
        start.time = max(start.time, 8.30am)
while end.day is weekend or holiday, end.day--, end.time = 11.59pm
end.time = min(end.time, 5.30pm)

// Now we've normalised, is there any time left?    
if start > end
   return 0

// Calculate time in first day    
timediff = 5.30pm - start.time
day = start.day + 1
// Add time on all intervening days
while(day < end.day)
   // returns 9 or 9.30hrs or 0 as appropriate, could be optimised to grab all records
   // from the database in 1 or 2 hits, by counting all intervening mondays, and all
   // intervening tue-fris (non-holidays)
   timediff += duration(day) 

// Add time on last day
timediff += end.time - 08.30am
if end.day is Monday then
    timediff += end.time - 08.00am
else
    timediff += end.time - 08.30am

return timediff

Вы могли сделать что-то как ИЗБРАННОЕ КОЛИЧЕСТВО (ДЕНЬ) ОТ ПРАЗДНИКА ГДЕ ПРАЗДНИК МЕЖДУ @Start И @End ДЕНЬ GROUP BY

считать количество праздников, падая в понедельник, во вторник, в среду, и т.д. Вероятно, способ заставить SQL считать только понедельники и непонедельники, хотя ни о чем не может думать в данный момент.

3
ответ дан 17 December 2019 в 04:54
поделиться

Существует также рекурсивное решение. Не обязательно эффективный, но большая забава:

public decimal ElapseddWorkingHours(DateTime start, DateTime finish)
{
    if (start.Date == finish.Date)
        return (finish - start).TotalHours;

    if (IsWorkingDay(start.Date))
        return ElapsedWorkingHours(start, new DateTime(start.Year, start.Month, start.Day, 17, 30, 0))
            + ElapsedWorkingHours(start.Date.AddDays(1).AddHours(DateStartTime(start.Date.AddDays(1)), finish);
    else
        return ElapsedWorkingHours(start.Date.AddDays(1), finish);
}
1
ответ дан 17 December 2019 в 04:54
поделиться

особенно рассмотрение метода IsWorkingDay поражает DB, чтобы видеть, является ли тот день государственным праздником

Если проблемой является количество запросов, а не объема данных, запросите данные рабочего дня из базы данных для всего дневного диапазона, в котором Вы нуждаетесь вначале вместо того, чтобы запросить в каждом повторении цикла.

1
ответ дан 17 December 2019 в 04:54
поделиться

Смотрите на Класс TimeSpan. Это даст Вам часы между любыми 2 разами.

Единственный вызов DB может также получить праздники между Вашими двумя разами; что-то вроде:

SELECT COUNT(*) FROM HOLIDAY WHERE HOLIDAY BETWEEN @Start AND @End

Умножьте то количество на 8 и вычтите его со своих общих часов.

- Ian

Править: В ответ на ниже, Если Вы - праздник, не постоянное число часов. можно сохранить a HolidayStart и a HolidayEnd Время в Вашем DB и и просто возвращает их от вызова до дб также. Проведите подсчет часа, подобный любому методу, на котором Вы обосновываетесь для основной стандартной программы.

1
ответ дан 17 December 2019 в 04:54
поделиться

Попробуйте что-то вдоль этих строк:

TimeSpan = TimeSpan Between Date1 And Date2
cntDays = TimeSpan.Days 
cntNumberMondays = Iterate Between Date1 And Date2 Counting Mondays 
cntdays = cntdays - cntnumbermondays
NumHolidays = DBCall To Get # Holidays BETWEEN Date1 AND Date2
Cntdays = cntdays - numholidays 
numberhours = ((decimal)cntdays * NumberHoursInWorkingDay )+((decimal)cntNumberMondays * NumberHoursInMondayWorkDay )
0
ответ дан 17 December 2019 в 04:54
поделиться

Построение, какой сказанный @OregonGhost, вместо того, чтобы использовать IsWorkingDay () функция в принимает день и возвращает булевскую переменную, имеет HolidayCount () функция, которая принимает диапазон и возвращает целое число, дающее количество Праздников в диапазоне. Прием здесь - то, если Вы имеете дело с частичной датой в течение своего граничного начала и дней конца, Вы, возможно, все еще должны определить, являются ли те даты самостоятельно праздниками. Но даже затем, Вы могли использовать новый метод, чтобы удостовериться, что Вам были нужны самое большее три вызова к DB.

0
ответ дан 17 December 2019 в 04:54
поделиться

Используйте запрос @Ian для проверки между датами для обнаружения, какие дни не являются рабочими днями. Затем сделайте некоторую математику, чтобы узнать, падают ли Ваше время начала или время окончания в нерабочий день, и вычтите различие.

Таким образом, если запуск является полуднем субботы, и конец является полуднем понедельника, запрос должен дать Вам назад 2 дня, с которых Вы вычисляете 48 часов (2 x 24). Если бы Ваш запрос на IsWorkingDay (запускается), возвращает false, вычтите от 24 время от запуска до полуночи, которая дала бы Вам 12 часов или общее количество 36 часов нерабочие часы.

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

Идеально, сделайте единый запрос на базе данных, которая дает Вам весь рабочий день между этими двумя разами (или даже даты). Затем сделайте математику локально от того набора.

0
ответ дан 17 December 2019 в 04:54
поделиться

Самый эффективный способ сделать это должно вычислить различие общего времени, затем вычесть время, которое является выходными или праздником. Существует довольно много пограничных случаев для рассмотрения, но можно упростить это путем взятия первых и последних дней диапазона и вычисления их отдельно.

КОЛИЧЕСТВО (*) метод, предложенный Ian Jacobs, походит на хороший способ считать праздники. Независимо от того, что Вы используете, это просто обработает целые дни, необходимо покрыть запуск и даты окончания отдельно.

Подсчет дней выходных дней легок; если у Вас есть функциональный Рабочий день (дата), которая возвращается 0 в течение понедельника до 6 в течение воскресенья, она похожа на это:

saturdays = ((finish - start) + Weekday(start) + 2) / 7;
sundays = ((finish - start) + Weekday(start) + 1) / 7;

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

0
ответ дан 17 December 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: