Друзья, добрый день, нужна помощь.
Есть база данных с записями о поступивших на номер звонках.
Необходимо сделать отчетик который бы выводил на страницу такие данные как среднее время разговора среднее время ожидании и тд, это не важно так как подсчет статистики я уже реализовал.
Вопрос в другом, данные нужно выводить за последние 3 дней вот тут у меня сложности и возникли, сначала хотел из сегодняшней даты вычитать 30 и потом прибавлять по одному, но получается что я смогу вычесть только до 1 числа месяца и более того не во всех месяцах 30 дней.В общем я в логическом тупике, прошу помощи :)
Каким образом вывести данные на страницу за последние 30 дней, как правильно сделать выборку из БД чтобы не делать отдельный запрос для каждого дня.
В идеале еще нужно сделать ссылки на данные за последние месяцы, но думаю с этим я разберусь когда буду понимать логику вычитания дат.
Заранее огромное спасибо.
PS в перле я очень слаб поэтому по возможности прошу давать развернутые ответы с кусками кода.
Эээ, дружище, причем тут база и перл? Нам бы узнать что это за база - MySQL, PostgreSQL, SQLite, CSV может. Плюс, нужно еще узнать какая структура у базы, потом уже можно будет помочь Вам..Скажем, если там MySQL и простая таблица, можно сдлеать такой запрос например:
SELECT
call_date,
AVG(call_duration) AS average_duration
FROM
calls
WHERE
call_date >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY
call_date
База MySQL.Таблица выглядит вот так: https://drive.google.com/file/d/0Byy2RDccuWnTdmQ5TXlSVm1iNkV...
сделать нужно что-то типа этого: https://docs.google.com/spreadsheets/d/1Dtby-VeUnt8Wg_WEYqeD...
на данный момент есть вот что:
#!/usr/bin/perl
use Date::Calc;
use CGI::Carp qw(fatalsToBrowser);
($mday,$mon,$year,) = localtime(time);
$year=$year+1900;
$mon=$mon+1;
if ($mon<10) { $mon="0".$mon; }
if ($mday<10) { $mday="0".$mday; }
$hour=$hour-1;
if ($hour<10) { $hour="0".$hour; }print "Content-type: text/html; charset=utf-8\n\n";
print "
<html>
<head>
<title>Отчет Call-Centr</title>
<style>
label {
display:block;
}
</style>
</head>
<body>";print "$mday.$mon.$year
";
print scalar localtime();
# Соединяемся с базой.
use DBI;
my $dsn='DBI:mysql:testasterisk:localhost';
my $db_user_name='testasterisk';
my $db_password='testpass';
my $dbh=DBI->connect($dsn,$db_user_name,$db_password) || die ("Ошибка: $DBI::errstr");
$dbh->do("SET NAMES utf8");
#делаем выборку по обработанным звонкам дня 1my $day1 = $mday-30; #пытался сделать по дням
print $day5;
my $sth = $dbh->prepare("
SELECT wait_time FROM stat WHERE Status='ANSWERED'");$sth->execute();
$sth->finish();
#делаем выборку по пропущенным звонкам
my $swt = $dbh->prepare("
SELECT AVG(wait_time) FROM stat WHERE Status='NO ANSWER'");$swt->execute();
#находим общее количество не отвеченных звонков
my $swtrows = $dbh->prepare("
SELECT wait_time FROM stat WHERE Status='NO ANSWER'");$swtrows->execute();
#находим максимальное время ожидания при не отвеченном звонке
my $swtm = $dbh->prepare("
SELECT MAX(wait_time) FROM stat WHERE Status='NO ANSWER'");$swtm->execute();
my $sup = $swtrows->rows; my $sup1 = $sth->rows; #сервисные переменные для подсчета звонков
my $row = $swt->fetchrow_array();
$sth->finish();
my $row1 = $swtm->fetchrow_array();
$swtm->finish();
$swt->finish();
$swtrows->finish();
$row = sprintf("%.0f",$row); #округляем
my $sup2=$sup+$sup1; #общее кол-во звонков
print "<table border=1 align=center>";
print "<tr><td>Число</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td><td>9</td><td>10</td>
<td>11</td><td>12</td><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td><td>18</td><td>19</td><td>20</td>
<td>21</td><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td><td>27</td><td>28</td><td>29</td><td>30</td><td>31</td></tr>"; #возможно не правильно в дальнейшем можно поменять
print "<tr><td>Общее количество обработанных звонков:</td><td>$sup2</td></tr>";
print "<tr><td>Среднее время ожидания ответа:</td><td>$row</td></tr>";
print "<tr><td>Максимальное время ожидания ответа:</td><td>$row1</td></tr>";
print "<tr><td>Общее количество не отвеченных звонков:</td><td>$sup</td></tr>";
print "<tr><td>Общее количество обработанных звонков:</td><td>$sup1</td></tr>";print "</table>";
print "
</body>
</html>";
$dbh->disconnect();
зачем вываливать сюда мусор с форматированием табличек?
> зачем вываливать сюда мусор с форматированием табличек?Я конечно извиняюсь, но вы на форум заходите для того чтобы помочь другим или хвост распускать, вы бы лучше по теме что-то посоветовали конкретное кроме как ссылок на мануалы, которые я и без вас прочитал и придирок к посту, спасибо что к грамматике моей не придрались.
> Я конечно извиняюсь, но вы на форум заходите для того чтобы помочь
> другим или хвост распускать, вы бы лучше по теме что-то посоветовали
> конкретное кроме как ссылок на мануалы, которые я и без вас
> прочитал и придирок к посту, спасибо что к грамматике моей не
> придрались.Я извиняться не буду ибо не за что. Если есть проблемы с расчетом даты - да к и оставляй куски с этим кодом. Портянки с html тут каким местом???
Как легко и просто вычитать даты я указал. Мож взять себя в руки, заткнуть фонтан нытья и погуглить что таки такое unix time? Там глядишь и прозрение придет.
этот крап можно на чистом sh организовать, а не городить CGI сервер. причем одним запросом.
echo 'SELECT avg(wait_time) as "Wiat time avg", wait_time as "wait_time", max(wait_time) from stat where status="NO ANSWER" and call_date >= DATE_SUB(NOW(), INTERVAL 1 MONTH);' | mysql -uuser -ppasswdа дальше его куда угодно. можно хоть почтой, хоть файлом, хоть в хтмл отформатировать и внешний css навесить для красоты.
Ты уровень кода глянь для начала ))if ($mon<10) { $mon="0".$mon; }
if ($mday<10) { $mday="0".$mday; }
$hour=$hour-1;
if ($hour<10) { $hour="0".$hour; }а это ваще огонь
my $day1 = $mday-30; #пытался сделать по дням
> этот крап можно на чистом sh организовать, а не городить CGI сервер.
> причем одним запросом.
> echo 'SELECT avg(wait_time) as "Wiat time avg", wait_time as "wait_time", max(wait_time)
> from stat where status="NO ANSWER" and call_date >= DATE_SUB(NOW(), INTERVAL 1
> MONTH);' | mysql -uuser -ppasswd
> а дальше его куда угодно. можно хоть почтой, хоть файлом, хоть в
> хтмл отформатировать и внешний css навесить для красоты.это получается статистика за месяц, а мне нужно за все дни месяца
спасибо так проще будет, вот бы как-то сделать это только для каждого дня
> это получается статистика за месяц, а мне нужно за все дни месяцаэто получается что ты ленивый и наглый идиот (да простит меня модер)
который читая про select не удосужился дочитать даже до group by,
хотя думаю не читал вообще - потому как не разобраться с тупейшей учебной задачей про селект надо сильно умудрится. в первой попавшейся книжке со 146% вероятностью подобная задачу будет рассмотрена в качестве примера.
и да, внизу есть пример с группировкой - но надо ведь так напрячься - скролить и читать.
> Вопрос в другом, данные нужно выводить за последние 3 дней вот тут
> у меня сложности и возникли, сначала хотел из сегодняшней даты вычитать
> 30 и потом прибавлять по одному, но получается что я смогу
> вычесть только до 1 числа месяца и более того не во
> всех месяцах 30 дней.фигня какая то понаписано и толком не понятно ...
я так понимаю проблема встала с получением параметра для datetime типа что бы указать его в запросе?
если нужно привязываться к дням месяца, месяцу, году и т.д. - сложностей вообще не вижу, читаем ман про временные функции перла.
если нужно брать произвольный интервал в любую стороно от произвольной точки времени - лучше сконвертить datetime в unix timestamp (unix time) обсчитать в нем сдвиги, результат сконвертить обратно.
>> Вопрос в другом, данные нужно выводить за последние 3 дней вот тут
>> у меня сложности и возникли, сначала хотел из сегодняшней даты вычитать
>> 30 и потом прибавлять по одному, но получается что я смогу
>> вычесть только до 1 числа месяца и более того не во
>> всех месяцах 30 дней.
> если нужно привязываться к дням месяца, месяцу, году и т.д. - сложностей
> вообще не вижу, читаем ман про временные функции перла.
> если нужно брать произвольный интервал в любую стороно от произвольной точки
> времени - лучше сконвертить datetime в unix timestamp (unix time) обсчитать
> в нем сдвиги, результат сконвертить обратно.вообщем правильно
еще можно почитать info date
там есть даже примеры
date --date='3 days ago'
>[оверквотинг удален]
>>> всех месяцах 30 дней.
>> если нужно привязываться к дням месяца, месяцу, году и т.д. - сложностей
>> вообще не вижу, читаем ман про временные функции перла.
>> если нужно брать произвольный интервал в любую стороно от произвольной точки
>> времени - лучше сконвертить datetime в unix timestamp (unix time) обсчитать
>> в нем сдвиги, результат сконвертить обратно.
> вообщем правильно
> еще можно почитать info date
> там есть даже примеры
> date --date='3 days ago'Скажите пожалуйста, каким образом мне связать дату высчитанную перлом и дату из таблицы БД, чтобы поместить высчитанные данные в нужную графу отчета?
>[оверквотинг удален]
>>> вообще не вижу, читаем ман про временные функции перла.
>>> если нужно брать произвольный интервал в любую стороно от произвольной точки
>>> времени - лучше сконвертить datetime в unix timestamp (unix time) обсчитать
>>> в нем сдвиги, результат сконвертить обратно.
>> вообщем правильно
>> еще можно почитать info date
>> там есть даже примеры
>> date --date='3 days ago'
> Скажите пожалуйста, каким образом мне связать дату высчитанную перлом и дату из
> таблицы БД, чтобы поместить высчитанные данные в нужную графу отчета?на мой не искушенный взгляд проблема простая:
Перестаньте работать с датой, как с набором чисел, начните работать с датой как с ДАТОЙ!
Вотсобственно и все...
>[оверквотинг удален]
>>> вообщем правильно
>>> еще можно почитать info date
>>> там есть даже примеры
>>> date --date='3 days ago'
>> Скажите пожалуйста, каким образом мне связать дату высчитанную перлом и дату из
>> таблицы БД, чтобы поместить высчитанные данные в нужную графу отчета?
> на мой не искушенный взгляд проблема простая:
> Перестаньте работать с датой, как с набором чисел, начните работать с датой
> как с ДАТОЙ!
> Вотсобственно и все...к сожалению, понятней не стало
> Скажите пожалуйста, каким образом мне связать дату высчитанную перлом и дату из
> таблицы БД, чтобы поместить высчитанные данные в нужную графу отчета?Высчитанную даты положить в одну переменную, дату из БД в другую, вставить обе переменные в строку отчета при выводе.
>> Скажите пожалуйста, каким образом мне связать дату высчитанную перлом и дату из
>> таблицы БД, чтобы поместить высчитанные данные в нужную графу отчета?
> Высчитанную даты положить в одну переменную, дату из БД в другую, вставить
> обе переменные в строку отчета при выводе.Так ты его совсем запутаешь, колонка SELECT - это не переменная.
Даты вычислять нужно в SQL, чтобы иметь Single Source of Truth.
SELECT
call_date,
DATE_SUB(NOW(), INTERVAL 1 MONTH),
AVG(call_duration) AS average_duration
FROM
calls
WHERE
call_date >= DATE_SUB(NOW(), INTERVAL 1 MONTH)
GROUP BY
call_date
>[оверквотинг удален]
>>> вообще не вижу, читаем ман про временные функции перла.
>>> если нужно брать произвольный интервал в любую стороно от произвольной точки
>>> времени - лучше сконвертить datetime в unix timestamp (unix time) обсчитать
>>> в нем сдвиги, результат сконвертить обратно.
>> вообщем правильно
>> еще можно почитать info date
>> там есть даже примеры
>> date --date='3 days ago'
> Скажите пожалуйста, каким образом мне связать дату высчитанную перлом и дату из
> таблицы БД, чтобы поместить высчитанные данные в нужную графу отчета?В чем проблема-то?
Как подставить переменную в sql запрос?
Возникает вопрос скрипт приведенный выше чужой?
Может поможет
http://www.mysql.ru/docs/man/Date_calculations.html
http://www.mysql.ru/docs/man/Date_and_time_functions.html
http://www.mysql.ru/docs/man/Using_DATE.html
> В чем проблема-то?в ДНК
> Вопрос в другом, данные нужно выводить за последние 3 дней вот тут
> В общем я в логическом тупике, прошу помощи :)взять текущее время в юникстайм
вычесть из него (60*60*24*3)
вставить в селект получившееся число.
это в большинстве случаев - вся что вам надо знать о вычислении разницы в датах.в зависимости от настройки базы или сессии - вы можете использовать разный формат даты. но из вашего скрипта мне вообще говоря не видно где у вас там колонка с датой?
то есть таймстамп то у вас в базе есть у строк?если таймтамп пишеться как дата- то там и так юникстайм по умолчанию... если текстовое поле- хреновый у вас был программист. ну тогда просто добавляется одна строка по преобразованию формата даты к юникстайму и далее все как описано выше...
чукча не читатель?
> Вопрос в другом, данные нужно выводить за последние 3 дней вот тут
> у меня сложности и возникли, сначала хотел из сегодняшней даты вычитать
> 30 и потом прибавлять по одному, но получается что я смогу
> вычесть только до 1 числа месяца и более того не во
> всех месяцах 30 дней.вычесть можно 30 дней,можно больше, можно меньше
> В общем я в логическом тупике, прошу помощи :)
> Каким образом вывести данные на страницу за последние 30 дней, как правильно
> сделать выборку из БД чтобы не делать отдельный запрос для каждого
> дня.нужно делать выборку сразу за весь требуемый период,
то есть за 30 дней, текущий месяц, предыдущий месяц или любой требуемый период времени> В идеале еще нужно сделать ссылки на данные за последние месяцы, но
> думаю с этим я разберусь когда буду понимать логику вычитания дат.там ничего сложного, когда поймешь ))
> Заранее огромное спасибо.
> PS в перле я очень слаб поэтому по возможности прошу давать развернутые
> ответы с кусками кода.видимо возникла сложность с передачей временных
параметров с/на страницу отчета и в базу данных?
> видимо возникла сложность с передачей временных
> параметров с/на страницу отчета и в базу данных?Вот в этом и проблема я не понимаю как помещать данные полученные из БД в нужные мне ячейки в таблице.
Как видно на примере я смог высчитать статистику за весь период, в принципе изменив запрос я могу сделать статистику за любой период, но сделать за последние n дней не понятно.
Жесть как же сложно объяснить.Как написать запрос вполне понятно, не понятно куда положить результаты запроса для вычислений и как потом результаты вычислений положить в нужные ячейки html таблицы, то есть под правильную дату. При этом чтоб она каждый день смещалась на день вперед.
Возможно я вообще все не правильно начал делать, я почти уверен что все не так. Поэтому я и написал на форумах, однако в ответ получил только критику и ссылки на мануалы которые уже читал.
>> видимо возникла сложность с передачей временных
>> параметров с/на страницу отчета и в базу данных?
> Вот в этом и проблема я не понимаю как помещать данные полученные
> из БД в нужные мне ячейки в таблице.
> Как видно на примере я смог высчитать статистику за весь период, в
> принципе изменив запрос я могу сделать статистику за любой период, но
> сделать за последние n дней не понятно.
> Жесть как же сложно объяснить.Я понял
> Как написать запрос вполне понятно, не понятно куда положить результаты запроса для
> вычислений и как потом результаты вычислений положить в нужные ячейки html
> таблицы, то есть под правильную дату. При этом чтоб она каждый
> день смещалась на день вперед.это делается в цикле
> Возможно я вообще все не правильно начал делать, я почти уверен что
> все не так. Поэтому я и написал на форумах, однако в
> ответ получил только критику и ссылки на мануалы которые уже читал.да, ты начал делать не совсем правильно,
я подскажу чуть позже, бывает легче показать на примере, чем объяснять
> я подскажу чуть позже, бывает легче показать на примере, чем объяснятьтак оно, жду.
>> я подскажу чуть позже, бывает легче показать на примере, чем объяснять
> так оно, жду.я сожалею, но моё обещание с примером затянулось
выдался вечерок свободного времени, набросал вариант выборки из БД
но затем, вижу, что на приведённом примере
https://docs.google.com/spreadsheets/d/1Dtby-VeUnt8Wg_WEYqeD...
отчёт строится горизонтально, а у меня вертикально ))пришлось переписать свой пример с максимально приближённому варианту БД из
https://drive.google.com/file/d/0Byy2RDccuWnTdmQ5TXlSVm1iNkV...и как всегда, возникают другие важные и неотложные дела,
которые не могут подождать и которые ну ни как нельзя отодвинутьнаписал весь скрипт полностью, захотелось проверить, что получилось ))
поскольку БД с asterisk под рукой нет, пришлось создать и затем набить эту БД
какими-то левыми значениями, мусором одним словомну не буду же я вносить сотню-другую строк вручную,
пришлось написать для этого другой скрипт ))захотелось сделать проверку входных данных, ну чтобы пользователь не мог
передать некорректные значения в переменные, мусор всякий (SQL-инъекции и всё такое прочее ))дописал скрипт
потом подумал, что возможно в моих скриптах не всё будет сходу понятно и
вызовет в свою очередь дополнительные вопросы, что, откуда и кудапришлось прокомментировать, максимально ))
в результате, скрипт растянулся до неприличных размеров
нет, ну если выкинуть проверки и порезать комменты, то в сухом остатке останется немногокороче, куда cкинуть, если ещё нужно ?
> короче, куда cкинуть, если ещё нужно ?
Спасибо большое!
ivanovroman.russia@gmail.com сюда можно либо залейте куда нибудь я скачаю
ушло, возможно упало в спам ))
кодировка koi8-r
> ушло, возможно упало в спам ))
> кодировка koi8-rну вот зачем ты подаешь нищим?
https://vk.com/hattabbi4особенно учитывая это:
"Роман Иванов запись закреплена
28 мар 2015
Действия
Ремонт компьютеров, ноутбуков.
- чистка
- настройка
- удаление вирусов
- удаление рекламы из браузеров
- удаление всплывающих окон при запуске
- ускорение работы
- установка ПО
Качественно, не дорого, в короткие сроки. "доперло? а?
> доперло? а?У вас такой характер мерзкий, я сочувствую вам и вашему окружению. Всего хорошего.
Pahanivo, ты, конечно, айтишник авторитетный, но зачем ты так ??> чукча не читатель?
> искренне раздражают попрошайки у церкви дышащие перегаром ...
> ну вот зачем ты подаешь нищим?унижая других - сам не возвысишься
ну о чём вообще сыр-бор?
ну возник вопрос, ну спросил человек на форуме помощи, и что?
его не сразу поняли, пытались помочь, когда поняли лучше,
многим стало лениво и скучно разжёвывать очевидные для них прописные истиныа мне было немного интересно, и я решил подсказать, просто помочь,
людям вообще свойственно делиться знаниями и опытомв stackoverflow вопросы бывают и простые и наивные, бывают и примитивные
и ничего, на них, как ни странно, тоже отвечают, терпеливо и с пониманием,
никто ещё не родился крутым всезнайкойв open source выкладывают такие крутые разработки, как говорится, без регистрации и смс
а тут.. несколько строк кода, скрипт, да если кому-то будет полезен - да на здоровье,
если ещё кому-то пригодится - вообще замечательно, может для себя что-то в прок отметят
пусть используют как угодно и где угоднозарабатывают? ну и что? это ИХ дело, не моё, зачем считать чужие деньги
> ну возник вопрос, ну спросил человек на форуме помощи, и что?лень читать доки и неумение понимать элементарные вещи (читай основы) не является технической проблемой
ну сразу же видно когда человек делает, натыкаясь на проблемы, и когда просит сделать за него его работу ...
> Pahanivo, ты, конечно, айтишник авторитетныйподъе*ал, негодяй :)
> ушло, возможно упало в спам ))
> кодировка koi8-rОгромное спасибо, особенно за второй скрипт, вы показали как делать все, и даже больше. Я очень вам благодарен.
Уже продал заказчику? ))
> Уже продал заказчику? ))Не флудите тут, если хотите пообщаться пишите в вк. Я с удовольствием уделю вам время.
> Не флудите тут, если хотите пообщаться пишите в вк. Я с удовольствием
> уделю вам время.Мне просто ценник интересен за эту "работу" ))
>> Уже продал заказчику? ))
> Не флудите тут,До его ответа на твоё "не флудИте" у вас было по 12 флудо-постов.
13 0 0 3 -3 Pahanivo
12 0 0 5 -6 HattabbI4
4 0 0 0 0 михалыч
2 0 0 0 0 VladimirV
> До его ответа на твоё "не флудИте" у вас было по 12
> флудо-постов.я то думаю че Андрюхи с аналитикой долго нет ... ))))
ну хватит ему уже подавать - товарищ вообще извилины ни разу не напряг.
> ну хватит ему уже подавать - товарищ вообще извилины ни разу не
> напряг.Вам не с кем пообщаться?
> Вам не с кем пообщаться?искренне раздражают попрошайки у церкви дышащие перегаром ...
>> Вам не с кем пообщаться?
> искренне раздражают попрошайки у церкви дышащие перегаром ...Бомбануло у тебя?
;)