Вы, кажется, пытаетесь создать таблицу часов. Если это так, я бы рекомендовал вывести два столбца: один для нижней границы интервала (который будет включительно), другой для верхней границы (который должен быть исключительным)
SELECT
CURRENT_DATE + INTERVAL (d0 * 10 + d1) hour AS start_date,
CURRENT_DATE + INTERVAL (d0 * 10+d1 + 1) hour AS end_date
FROM (SELECT 0 AS d0 UNION SELECT 1 UNION SELECT 2) AS t1
CROSS JOIN (
SELECT 0 AS d1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION
SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) AS t2
WHERE (d0 * 10 + d1) < 24
ORDER BY d0,d1;
This создает набор результатов, например :
start_date | end_date
:------------------ | :------------------
2020-03-10 00:00:00 | 2020-03-10 01:00:00
2020-03-10 01:00:00 | 2020-03-10 02:00:00
2020-03-10 02:00:00 | 2020-03-10 03:00:00
...
2020-03-10 21:00:00 | 2020-03-10 22:00:00
2020-03-10 22:00:00 | 2020-03-10 23:00:00
2020-03-10 23:00:00 | 2020-03-11 00:00:00
Затем вы можете объединить его с исходной таблицей с полуоткрытым интервалом, например:
SELECT ...
FROM myintervals i
LEFT JOIN mytable t
ON t.date >= i.start_date and t.date < i.end_date
Преимущество этого подхода что он правильно обрабатывает первую и последнюю минуты каждого интервала.
Редактировать : чтобы получить точные желаемые результаты, вы можете сделать:
SELECT
CURRENT_DATE
+ INTERVAL (d0 * 10 + d1) hour
+ INTERVAL 1 minute AS start_date,
CURRENT_DATE
+ INTERVAL (d0 * 10+d1 + 1) hour
- INTERVAL (case when d0 * 10+d1 = 23 THEN 1 ELSE 0 END) minute AS end_date
FROM (SELECT 0 AS d0 UNION SELECT 1 UNION SELECT 2) AS t1
CROSS JOIN (
SELECT 0 AS d1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION
SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) AS t2
WHERE (d0 * 10 + d1) < 24
ORDER BY d0,d1;
Демонстрация на DB Fiddle