#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), если у вас это есть.