Получить количество строк, вставленных в базу данных в час

#php #sql #sql-server #count #date-arithmetic

#php #sql #sql-сервер #подсчитать #дата-арифметика

Вопрос:

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

У меня есть такой запрос :

 "SELECT dbo.tbTransaction.dateHeure, dbo.tbTransaction.Etat, dbo.tbPoste.nomPoste
        FROM dbo.tbTransaction 
        INNER JOIN dbo.tbPoste ON dbo.tbTransaction.ID_poste = dbo.tbPoste.ID_POSTE
        WHERE dbo.tbPoste.id_site LIKE 47 
        AND dbo.tbPoste.nomPoste LIKE '0909_CLIENT'
        AND dateHeure >= DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0)
        ORDER BY dateHeure DESC";
 

Это позволяет мне извлекать все вставки базы данных из d ay(>= DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0)) для определенного post (0909_CLIENT), отсортированные по самому последнему времени вставки ( ORDER BY dateHeure DESC ).

Я хотел бы иметь возможность получать количество вставок в час, цель состоит в том, чтобы иметь возможность генерировать живую графику час за часом.

Мне удается получить общее количество вставок в течение дня с помощью :

 $params = array();
    $options = array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
    $result = sqlsrv_query( $conn, $sql , $params, $options );
    $row_count = sqlsrv_num_rows( $result ). PHP_EOL;
    echo '<br>';
     if ($row_count === false)
     echo "Error in retrieveing row count;
    else {
      echo $row_count;
     } 
 

Я могу видеть строки, введенные в базу данных в определенное время с помощью :

 $five = "05:";
$six = "06:";
$seven = "07:";


if ($result === false) {
    die(print_r(sqlsrv_errors(), true));
} else {
    while ($row = sqlsrv_fetch_array($result)) {
        $heureformate = $row["dateHeure"]->format('H:i');
        
        if (strpos($heureformate, $five) !== false) {
            echo $heureformate;
            echo '<br>';
            //count(array($heureformate));
        } elseif (strpos($heureformate, $six) !== false) {
            echo $heureformate;
            echo '<br>';
        } elseif (strpos($heureformate, $seven) !== false) {
            echo $heureformate;
            echo '<br>';
        } 
    } 
}
 

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

Если у вас есть какие-либо идеи о том, как получить это число в SQL или PHP , пожалуйста, помогите мне.

Комментарии:

1. Попробуйте добавить group by hour(your_datetime_column) в свой запрос.

2. Я пытался, но у меня есть «Час не является распознанным именем встроенной функции»

3. о, извините, я думал, что это mysql.

4. Не волнуйтесь, спасибо за предложение 😉

Ответ №1:

Вам нужна агрегация?

 select  datepart(hour, t.dateheure), count(*) as cnt
from dbo.tbtransaction t
inner join dbo.tbposte p on t.id_poste = p.id_poste
where p.id_site = 47 and p.nomposte = '0909_client' and t.dateheure >= cast(gedate() as date)
group by datepart(hour, dateheure)
 

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

Обратите внимание, что я упростил логику фильтрации по дате и превратил like условия в равенства (поскольку подстановочные знаки не используются, оба они эквивалентны).

Комментарии:

1. Здравствуйте, сэр, вы не знаете, можно ли добавить дополнительные ограничения в этот запрос? Например, указать временные интервалы или ограничить последние десять часов? Я горю желанием учиться, не стесняйтесь поделиться со мной некоторыми учебными пособиями или веб-сайтами по этому вопросу (помимо документации Microsoft), если у вас это есть.