The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Вывод данных из БД за последние н дней, !*! HattabbI4, 26-Мрт-17, 10:23  [смотреть все]
Друзья, добрый день, нужна помощь.
Есть база данных с записями о поступивших на номер звонках.
Необходимо сделать отчетик который бы выводил на страницу такие данные как среднее время разговора среднее время ожидании и тд, это не важно так как подсчет статистики я уже реализовал.
Вопрос в другом, данные нужно выводить за последние 3 дней вот тут у меня сложности и возникли, сначала хотел из сегодняшней даты вычитать 30 и потом прибавлять по одному, но получается что я смогу вычесть только до 1 числа месяца и более того не во всех месяцах 30 дней.

В общем я в логическом тупике, прошу помощи :)

Каким образом вывести данные на страницу за последние 30 дней, как правильно сделать выборку из БД чтобы не делать отдельный запрос для каждого дня.

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

Заранее огромное спасибо.

PS в перле я очень слаб поэтому по возможности прошу давать развернутые ответы с кусками кода.

  • Вывод данных из БД за последние н дней, !*! курил, 01:16 , 27-Мрт-17 (1)
    Эээ, дружище, причем тут база и перл? Нам бы узнать что это за база - 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

    • Вывод данных из БД за последние н дней, !*! HattabbI4, 07:22 , 27-Мрт-17 (2) –1
      База 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");
      #делаем выборку по обработанным звонкам дня 1

      my $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();

      • Вывод данных из БД за последние н дней, !*! Pahanivo, 11:37 , 27-Мрт-17 (4)
        зачем вываливать сюда мусор с форматированием табличек?


        • Вывод данных из БД за последние н дней, !*! HattabbI4, 11:41 , 27-Мрт-17 (5) –2
          > зачем вываливать сюда мусор с форматированием табличек?

          Я конечно извиняюсь, но вы на форум заходите для того чтобы помочь другим или хвост распускать, вы бы лучше по теме что-то посоветовали конкретное кроме как ссылок на мануалы, которые я и без вас прочитал и придирок к посту, спасибо что к грамматике моей не придрались.

          • Вывод данных из БД за последние н дней, !*! Pahanivo, 11:50 , 27-Мрт-17 (6)
            > Я конечно извиняюсь, но вы на форум заходите для того чтобы помочь
            > другим или хвост распускать, вы бы лучше по теме что-то посоветовали
            > конкретное кроме как ссылок на мануалы, которые я и без вас
            > прочитал и придирок к посту, спасибо что к грамматике моей не
            > придрались.

            Я извиняться не буду ибо не за что. Если есть проблемы с расчетом даты - да к и оставляй куски с этим кодом. Портянки с html тут каким местом???
            Как легко и просто вычитать даты я указал. Мож взять себя в руки, заткнуть фонтан нытья и погуглить что таки такое unix time? Там глядишь и прозрение придет.

      • Вывод данных из БД за последние н дней, !*! mr_gfd, 19:18 , 03-Апр-17 (17)
        этот крап можно на чистом 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 навесить для красоты.

        • Вывод данных из БД за последние н дней, !*! Pahanivo, 23:47 , 04-Апр-17 (18) –1
          Ты уровень кода глянь для начала ))

          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; #пытался сделать по дням

        • Вывод данных из БД за последние н дней, !*! HattabbI4, 17:22 , 06-Апр-17 (21)
          > этот крап можно на чистом 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 навесить для красоты.

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

          • Вывод данных из БД за последние н дней, !*! Pahanivo, 12:52 , 08-Апр-17 (24)
            > это получается статистика за месяц, а мне нужно за все дни месяца

            это получается что ты ленивый и наглый идиот (да простит меня модер)
            который читая про select не удосужился дочитать даже до group by,
            хотя думаю не читал вообще - потому как не разобраться с тупейшей учебной задачей про селект надо сильно умудрится. в первой попавшейся книжке со 146% вероятностью подобная задачу будет рассмотрена в качестве примера.
            и да, внизу есть пример с группировкой - но надо ведь так напрячься - скролить и читать.


  • Вывод данных из БД за последние н дней, !*! Pahanivo, 11:36 , 27-Мрт-17 (3)
    > Вопрос в другом, данные нужно выводить за последние 3 дней вот тут
    > у меня сложности и возникли, сначала хотел из сегодняшней даты вычитать
    > 30 и потом прибавлять по одному, но получается что я смогу
    > вычесть только до 1 числа месяца и более того не во
    > всех месяцах 30 дней.

    фигня какая то понаписано и толком не понятно ...
    я так понимаю проблема встала с получением параметра для datetime типа что бы указать его в запросе?
    если нужно привязываться к дням месяца, месяцу, году и т.д. - сложностей вообще не вижу, читаем ман про временные функции перла.
    если нужно брать  произвольный интервал в любую стороно от произвольной точки времени - лучше сконвертить datetime в unix timestamp (unix time) обсчитать в нем сдвиги, результат сконвертить обратно.

    • Вывод данных из БД за последние н дней, !*! VladimirV, 18:16 , 27-Мрт-17 (7)
      >> Вопрос в другом, данные нужно выводить за последние 3 дней вот тут
      >> у меня сложности и возникли, сначала хотел из сегодняшней даты вычитать
      >> 30 и потом прибавлять по одному, но получается что я смогу
      >> вычесть только до 1 числа месяца и более того не во
      >> всех месяцах 30 дней.
      > если нужно привязываться к дням месяца, месяцу, году и т.д. - сложностей
      > вообще не вижу, читаем ман про временные функции перла.
      > если нужно брать  произвольный интервал в любую стороно от произвольной точки
      > времени - лучше сконвертить datetime в unix timestamp (unix time) обсчитать
      > в нем сдвиги, результат сконвертить обратно.

      вообщем правильно
      еще можно почитать info date
      там есть даже примеры
      date --date='3 days ago'


      • Вывод данных из БД за последние н дней, !*! HattabbI4, 07:01 , 28-Мрт-17 (8) –1
        >[оверквотинг удален]
        >>> всех месяцах 30 дней.
        >> если нужно привязываться к дням месяца, месяцу, году и т.д. - сложностей
        >> вообще не вижу, читаем ман про временные функции перла.
        >> если нужно брать  произвольный интервал в любую стороно от произвольной точки
        >> времени - лучше сконвертить datetime в unix timestamp (unix time) обсчитать
        >> в нем сдвиги, результат сконвертить обратно.
        > вообщем правильно
        > еще можно почитать info date
        > там есть даже примеры
        >  date --date='3 days ago'

        Скажите пожалуйста, каким образом мне связать дату высчитанную перлом и дату из таблицы БД, чтобы поместить высчитанные данные в нужную графу отчета?

        • Вывод данных из БД за последние н дней, !*! fantom, 12:16 , 28-Мрт-17 (9)
          >[оверквотинг удален]
          >>> вообще не вижу, читаем ман про временные функции перла.
          >>> если нужно брать  произвольный интервал в любую стороно от произвольной точки
          >>> времени - лучше сконвертить datetime в unix timestamp (unix time) обсчитать
          >>> в нем сдвиги, результат сконвертить обратно.
          >> вообщем правильно
          >> еще можно почитать info date
          >> там есть даже примеры
          >>  date --date='3 days ago'
          > Скажите пожалуйста, каким образом мне связать дату высчитанную перлом и дату из
          > таблицы БД, чтобы поместить высчитанные данные в нужную графу отчета?

          на мой не искушенный взгляд проблема простая:
          Перестаньте работать с датой, как с набором чисел, начните работать с датой как с ДАТОЙ!
          Вотсобственно и все...

          • Вывод данных из БД за последние н дней, !*! HattabbI4, 12:21 , 28-Мрт-17 (10) –1
            >[оверквотинг удален]
            >>> вообщем правильно
            >>> еще можно почитать info date
            >>> там есть даже примеры
            >>>  date --date='3 days ago'
            >> Скажите пожалуйста, каким образом мне связать дату высчитанную перлом и дату из
            >> таблицы БД, чтобы поместить высчитанные данные в нужную графу отчета?
            > на мой не искушенный взгляд проблема простая:
            > Перестаньте работать с датой, как с набором чисел, начните работать с датой
            > как с ДАТОЙ!
            > Вотсобственно и все...

            к сожалению, понятней не стало

        • Вывод данных из БД за последние н дней, !*! Pahanivo, 14:44 , 28-Мрт-17 (11)
          > Скажите пожалуйста, каким образом мне связать дату высчитанную перлом и дату из
          > таблицы БД, чтобы поместить высчитанные данные в нужную графу отчета?

          Высчитанную даты положить в одну переменную, дату из БД в другую, вставить обе переменные в строку отчета при выводе.

          • Вывод данных из БД за последние н дней, !*! ACCA, 17:58 , 28-Мрт-17 (12)
            >> Скажите пожалуйста, каким образом мне связать дату высчитанную перлом и дату из
            >> таблицы БД, чтобы поместить высчитанные данные в нужную графу отчета?
            > Высчитанную даты положить в одну переменную, дату из БД в другую, вставить
            > обе переменные в строку отчета при выводе.

            Так ты его совсем запутаешь, колонка 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

        • Вывод данных из БД за последние н дней, !*! VladimirV, 18:21 , 28-Мрт-17 (13)
          >[оверквотинг удален]
          >>> вообще не вижу, читаем ман про временные функции перла.
          >>> если нужно брать  произвольный интервал в любую стороно от произвольной точки
          >>> времени - лучше сконвертить 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

  • Вывод данных из БД за последние н дней, !*! ss, 08:58 , 31-Мрт-17 (15) –2
    > Вопрос в другом, данные нужно выводить за последние 3 дней вот тут
    > В общем я в логическом тупике, прошу помощи :)

    взять текущее время в юникстайм
    вычесть из него (60*60*24*3)
    вставить в селект получившееся число.
    это в большинстве случаев - вся что вам надо знать о вычислении разницы в датах.

    в зависимости от настройки базы или сессии - вы можете использовать разный формат даты. но из вашего скрипта мне вообще говоря не видно где у вас там колонка с датой?
    то есть таймстамп то у вас в базе есть у строк?

    если таймтамп пишеться как дата- то там и так юникстайм по умолчанию... если текстовое поле- хреновый у вас был программист. ну тогда просто добавляется одна строка по преобразованию формата даты к юникстайму и далее все как описано выше...

  • Вывод данных из БД за последние н дней, !*! михалыч, 07:40 , 06-Апр-17 (19)
    > Вопрос в другом, данные нужно выводить за последние 3 дней вот тут
    > у меня сложности и возникли, сначала хотел из сегодняшней даты вычитать
    > 30 и потом прибавлять по одному, но получается что я смогу
    > вычесть только до 1 числа месяца и более того не во
    > всех месяцах 30 дней.

    вычесть можно 30 дней,можно больше, можно меньше

    > В общем я в логическом тупике, прошу помощи :)
    > Каким образом вывести данные на страницу за последние 30 дней, как правильно
    > сделать выборку из БД чтобы не делать отдельный запрос для каждого
    > дня.

    нужно делать выборку сразу за весь требуемый период,
    то есть за 30 дней, текущий месяц, предыдущий месяц или любой требуемый период времени

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

    там ничего сложного, когда поймешь ))

    > Заранее огромное спасибо.
    > PS в перле я очень слаб поэтому по возможности прошу давать развернутые
    > ответы с кусками кода.

    видимо возникла сложность с передачей временных
    параметров с/на страницу отчета и в базу данных?

    • Вывод данных из БД за последние н дней, !*! HattabbI4, 11:57 , 06-Апр-17 (20)

      > видимо возникла сложность с передачей временных
      > параметров с/на страницу отчета и в базу данных?

      Вот в этом и проблема я не понимаю как помещать данные полученные из БД в нужные мне ячейки в таблице.
      Как видно на примере я смог высчитать статистику за весь период, в принципе изменив запрос я могу сделать статистику за любой период, но сделать за последние n дней не понятно.
      Жесть как же сложно объяснить.

      Как написать запрос вполне понятно, не понятно куда положить результаты запроса для вычислений и как потом результаты вычислений положить в нужные ячейки html таблицы, то есть под правильную дату. При этом чтоб она каждый день смещалась на день вперед.

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

      • Вывод данных из БД за последние н дней, !*! михалыч, 19:57 , 06-Апр-17 (22)
        >> видимо возникла сложность с передачей временных
        >> параметров с/на страницу отчета и в базу данных?
        > Вот в этом и проблема я не понимаю как помещать данные полученные
        > из БД в нужные мне ячейки в таблице.
        > Как видно на примере я смог высчитать статистику за весь период, в
        > принципе изменив запрос я могу сделать статистику за любой период, но
        > сделать за последние n дней не понятно.
        > Жесть как же сложно объяснить.

        Я понял

        > Как написать запрос вполне понятно, не понятно куда положить результаты запроса для
        > вычислений и как потом результаты вычислений положить в нужные ячейки html
        > таблицы, то есть под правильную дату. При этом чтоб она каждый
        > день смещалась на день вперед.

        это делается в цикле

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

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру