Filtrar registros com intervalos de tempo pré-definidos no MySQL, usando PHP

Pessoal, estou fazendo um sistema de datalogger e gostaria de saber se existe alguma função intrínseca do MySQL para pegar, na tela de pesquisa de registros, o valor em um intervalo de tempo pré-definido, ou se eu devo programar para comparar se o timestamp é igual ou imediatamente superior ao anterior, criar um array e incluir nele os valores com esse tempo pré-definidos. Caso essa situação só se resolva com programação (No meu caso, estou usando PHP), a ideia de fazer um fetch de todos os registros no intervalo completo de interesse e testando a condição do tempo é a forma mais eficaz/elegante de se fazer?

Por exemplo, os registros são armazenados no banco de dados a cada 30 segundos, mas eu queria fazer um gráfico que pegue apenas os dados de hora em hora. Assim, eu pegaria o primeiro registro, em seguida, eu descartaria do gráfico os registros seguintes cujos valores fossem menores do que 1 hora em relação ao primeiro registro filtrado. Em seguida, iria inserir no gráfico o registro cujo valor fosse 1 hora maior do que o segundo registro filtrado, e assim, sucessivamente. Seria como usar o limit/offset, mas ao invés de filtrar pelo número do registro, seria pela data/hora.

Agradeço desde já o apoio

BETWEEN não ajuda?

SELECT col1, col2, col3, col_com_data FROM tabela WHERE col_com_data BETWEEN '2019-01-01' AND '2019-10-25';

ONDE col_com_data é uma coluna do tipo date, datetime ou timestamp que armazena a data do evento em questão.
No caso, o exemplo indica que serão buscados todos os registros entre 01/01/2019 até 25/10/2019.

Oi, @darlan_machado. Eu já estou usando BETWEEN. O detalhe é que ele pega todos os registros no intervalo, mas eu quero apenas os registros com o campo timestamp a cada 1 hora, ou a cada 15 minutos, etc. Então não seriam todos os registros no intervalo. Assim, queria saber se o MySQL tem um filtro que me permita pegar os registros a cada 1 hora (Registro com timestamp às 17:00, às 18:00, etc.) ou devo fazer isso a nível de programação, verificando se a hora é exatamente igual ou imediatamente superior a 1h, levando em consideração que às 17:00 fechada não tinha registro, mas o banco de dados demorou um pouco mais para salvar os dados no banco, então seria 17:01, por exemplo).
De qualquer forma, gostaria de agradecer sua rápida resposta.

Cara, tá bem confuso.
O between vale para timestamp também…

Deixe-me ver se eu me expresso melhor:
Eu tenho uma tabela que recebe a coleta de dados analógicos de um sensor e os campos da tabela são: id, timestamp, temperatura e umidade. O Arduino envia os dados para o banco de dados a cada 30 segundos. Eu criei uma tela web para gerar o gráfico desses dados, utilizando como filtro os dados entre dois períodos (data e hora). Acontece que, na tela, é possível ver o eixo X com o timestamp até 1000 registros para caber na mesma tela sem ter rolagem (scroll) de tela. Então, eu queria que, se o período que o usuário digitasse para ver o gráfico tivesse muitos itens, coubesse tudo na tela. Para isso, criei mais 2 campos de filtro: um campo do tipo “select” para o usuário dizer se quer ver os registros de hora em hora, a cada 15 minutos, 1 dia por semana, etc. Além disso, tem um campo do tipo “text”, que indica quantos registros aparecerão. Por exemplo, se o usuário escolher a opção “hora” e digitar o valor “15”, será exibido o primeiro registro, depois só será exibido o registro cujo timestamp seja uma hora depois do primeiro registro, e assim sucessivamente. Então eu terei no gráfico 15 registros, espaçados entre um eo seguinte em uma hora (Lembrando que o tempo em que o Arduino salva no banco de dados são 30 segundos). Assim, eu não deixaria aparecer no gráfico os registros a cada 30 segundos e, sim, a cada hora (ocultando no gráfico os demais registros que tenham menos de 1 hora de intervalo entre o primeiro registro).
Quando chegar em casa, eu mando uma foto da tela para ver se a imagem esclarece mais do que o texto

Oi, @darlan_machado. Seguem as imagens da tela que estou fazendo. A primeira parte é o filtro, onde coloquei o período de ‘01/01/2018 00:00’ a ‘27/10/2019 23:53’, com intervalo de 15 minutos (O GUJ não me permitiu colocar 2 imagens, então excluí a imagem do filtro). Então, eu gostaria que fossem exibidos os dados das 00:00, 00:15, 00:30, 00:45, etc. (Ou seja, a cada 15 min).
A consulta SQL que utilizei para exibir os dados foi "SELECT id, dataHora, temperatura FROM dados WHERE dataHora BETWEEN ‘2018-01-01 00:00’ AND ‘2019-10-27 23:53’ ORDER BY dataHora DESC LIMIT 100. Por isso que do lado esquerdo do gráfico a seguir ficou com o maior horário 27/10 às 23:46:59.

Ao invés de aparecer antes desse horário o valor 27/10 às 23:46:29, por exemplo, eu gostaria que fosse exibido o timestamp referente ao registro que foi 15 minutos antes dele, ou seja, 27/10 às 23:31:59. Assim, todos os outros valores maiores do que 23:31:59 e menores que 23:46:59 não deveriam aparecer no gráfico. O mesmo acontece com os dados seguintes, ou seja, só deverão aparecer no gráfico os registros com o intervalo de tempo pré-definido que, neste caso da primeira tela, foi de 15 minutos. Isso faz com que fosse possível exibir na tela completa, sem aparecer o scroll todo o período que o usuário digitar. Perceba que, embora o usuário tenha solicitado o período de 01/01/2018 a 27/10/2019, os dados não couberam na tela e só pegaram os últimos registros. Minha ideia era que o usuário pudesse ajustar o intervalo (15 minutos, 1 hora, 1 dia, 1 semana, 1 mês, etc.) entre os registros para que fosse possível ser exibido na tela todo o período (01/01/2018 a 27/10/2019) que o usuário desejar, ocultando os registros que tenham intervalo de tempo menores do que o escolhido pelo usuário.
Veja se agora consegui ser mais claro.

Amigo, não sei se já conseguiu resolver o problema, mas se você conseguiu, poderia compartilhar? Estou com este mesmo problema, já tentei fazer este SELECT de diversas formas mas até agora não obtive êxito. Se puder compartilhar ficarei bastante grato.