Прежде чем приступить к оптимизации, задайте себе два вопроса.
а) Это работает?
б) Это слишком медленно?
Только если вы ответите на оба вопроса «да», вы готовы начать оптимизацию.
Помимо этого
- вам нужно беспокоиться только о минутах и часах в день начала и день окончания. Промежуточные дни, очевидно, будут полными 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 DAY
для подсчета количества выходных в понедельник, вторник, среду и т. Д. Вероятно, это способ заставить SQL считать только понедельники и не понедельники, хотя пока ничего не может придумать.