sub($int); $begin = $date->getTimestamp(); $int->d = 7; $end = $date->add($int)->getTimestamp(); return self::getHistoryTotal($action_ids,$begin,$end); } // ВЫБОРКА ЗА МЕСЯЦ static function getMyHistoryTotalThisMonth(){ $a = Action::getMy(); $ids = array_keys($a); return self::getHistoryTotalThisDay($ids); } static function getHistoryTotalThisMonth($action_ids){ return self::getHistoryTotalMonthByDate($action_ids,date('Y-m-d')); } static function getHistoryTotalMonthByDate($action_ids,$date){ $begin = strtotime( date('Y-m-01'), strtotime($date) ); $end = $begin + 24*60*60*date('t',$begin); return self::getHistoryTotal($action_ids,$begin,$end); } // ВЫБОРКА ЗА ГОД static function getMyHistoryTotalThisYear(){ $a = Action::getMy(); $ids = array_keys($a); return self::getHistoryTotalThisDay($ids); } static function getHistoryTotalThisYear($action_ids){ return self::getHistoryTotalYearByDate($action_ids,date('Y-m-d')); } static function getHistoryTotalYearByDate($action_ids,$date){ $begin = strtotime( date('Y-01-01'), strtotime($date) ); $end = $begin + 24*60*60*(date('L')?366:365); return self::getHistoryTotal($action_ids,$begin,$end); } // ПОЛУЧЕНИЕ КОЛИЧЕСТВА ВРЕМЕНИ ДЕЙСТВИЙ ЗА ПЕРИОД static function getHistoryTotal($action_ids,$begin,$end){ $res = []; $ids = []; foreach ($action_ids as $k=>$v){ $ids[$k] = intval($v); } $date_begin = date('Y-m-d',$begin); $date_end = date('Y-m-d',$end-1); if($ids){ // Сначала считаем те, которые чётко попали в промежуток $r = self::select($q = [ \Query::SELECT => [ self::$ACTION, 'SUM('.self::$DURATION.') as duration', ], \Query::WHERE => new \Where(\Where::_and([ \Where::_in(self::$ACTION,$ids), \Where::_and([ \Where::_and([ \Where::_operator(self::$DATE_BEGIN,'>=',$date_begin), \Where::_operator(self::$DATE_BEGIN,'<=',$date_end), ]), \Where::_and([ \Where::_operator(self::$DATE_END,'>=',$date_begin), \Where::_operator(self::$DATE_END,'<=',$date_end), ]), ]) ]) ), \Query::GROUP_BY => self::$ACTION ]); while($l = \DB::fetch($r)){ $action_id = intval($l[self::$ACTION]); $res[$action_id] += $l['duration']; } /// Теперь надо посчитать те, которые попали в этот период, на частично. $r = self::select([ \Query::SELECT => [ self::$ACTION, self::$BEGIN, self::$END, ], \Query::WHERE => new \Where(\Where::_and([ \Where::_in(self::$ACTION,$ids), \Where::_and([ \Where::_or([ // Либо те, у которых начало меньше, но окончание где-то за началом \Where::_and([ \Where::_operator(self::$DATE_BEGIN,'<',$date_begin), \Where::_operator(self::$DATE_END,'>=',$date_begin), ]), // Либо те, у которых начало меньше окончания периода, но окончание за ним \Where::_and([ \Where::_operator(self::$DATE_BEGIN,'<=',$date_end), \Where::_operator(self::$DATE_END,'>',$date_end), ]), ]) ]) ]) ), ]); while($l = \DB::fetch($r)){ $action_id = $l[self::$ACTION]; $h_begin = $l[self::$BEGIN]; $h_end = $l[self::$END]; // Возможны три ситуации // Дейстие начали и закончили вне рамок периода if($h_begin < $begin and $h_end > $end){ // В таком случае, просто к длительности прибавляем весь период $res[$action_id] += $end - $begin; // Действие началось до начала, и закончилось, где-то в периоде } else if($h_begin < $begin and $h_end < $end){ // В таком случае прибавляем разницу от начала периода до окончания $res[$action_id] += $h_end - $begin; // Случай, когда начало, позже начала периода, а окончание позже окончания пеиода } else if($h_begin > $begin and $h_end > $end){ // В таком случаем, прибавлеям разницу от начала, до окончания периода $res[$action_id] += $end - $h_begin; } } } return $res; } static function columnInfo() : array { return [ new C([ C::VAR_NAME =>&self::$ID, C::TYPE =>eColumnType::INT, C::AUTO_INCREMENT =>true, C::PRIMARY =>true, C::DEFAULT =>0, C::HIDDEN =>true, C::TH =>V::get(Vars::$ID), ]), new C([ C::VAR_NAME => &self::$ACTION, C::TYPE => eColumnType::INT, ]), new C([ C::VAR_NAME => &self::$BEGIN, C::TYPE => eColumnType::INT, ]), new C([ C::VAR_NAME => &self::$END, C::TYPE => eColumnType::INT, ]), new C([ C::VAR_NAME => &self::$DATE_BEGIN, C::TYPE => eColumnType::DATE, ]), new C([ C::VAR_NAME => &self::$DATE_END, C::TYPE => eColumnType::DATE, ]), new C([ C::VAR_NAME => &self::$DURATION, C::TYPE => eColumnType::INT, ]), new C([ C::VAR_NAME => &self::$PAUSE, C::TYPE => eColumnType::INT, ]), new C([ C::VAR_NAME => &self::$PROFILE, C::TYPE => eColumnType::INT, C::DEFAULT => intval(PID), ]), new C([ C::VAR_NAME => &self::$PORTAL, C::TYPE => eColumnType::INT, C::DEFAULT => intval(\Site::$portal_id), ]), new C([ C::VAR_NAME => &self::$COMMENT, C::TYPE => eColumnType::TEXT, ]), new C([ C::VAR_NAME => &self::$ACCOUNT, C::TYPE => eColumnType::INT, C::DEFAULT => intval(\Site::$owner_id), ]), ]; } } new History(); ///