Я знаю, что подобные вопросы уже были, но я не могу найти четкого и простого ответа.
У меня есть этот запрос:
"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";
Это позволяет мне получить все вставки базы данных day(>= DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0)) для определенного сообщения (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, пожалуйста, помогите мне.
Я пробовал, но у меня "Час не является распознанным именем встроенной функции"
О, извините, я думал, что это mysql.
Не волнуйтесь, спасибо за предложение ;)
Хотите агрегацию?
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 в равенство (поскольку подстановочные знаки не используются, оба эквивалентны).
Здравствуйте, сэр, вы не знаете, можно ли добавить дополнительные ограничения в этот запрос? Например, указать временные интервалы или ограничиться последними десятью часами? Я очень хочу учиться, не стесняйтесь поделиться со мной некоторыми учебниками или веб-сайтами по этой теме (кроме документации Microsoft), если у вас есть это.
Попробуйте добавить group by hour(your_datetime_column) к вашему запросу.