Доброго времени суток.
Выявляю временные отрезки между заданным временным отрезком. Проще говоря между девятью и десятью часами шесть временных отрезков продолжительностью 10 мин. Вот код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
SELECT t.event_date,
case
when TIME_TO_SEC(t.event_date) >= inter.begin AND TIME_TO_SEC(t.event_date) < inter.end -- типичный случай, определяем номер интервала
then floor((TIME_TO_SEC(t.event_date) - inter.begin) / inter.width) + 1
when TIME_TO_SEC(t.event_date) = inter.end -- особый случай, определяем правильный номер интервала ровно на окончании дневного периода
then floor((inter.end - inter.begin) / inter.width)
when TIME_TO_SEC(t.event_date) < inter.begin -- маркируем номер интервала до начала дневного периода
then -1
when TIME_TO_SEC(t.event_date) > inter.end -- маркируем номер интервала после окончания дневного периода
then -2
else null -- экстраситуация, если when-then охватывают все условия, то сюда никогда не попадем
end as full_interval_number,
case
when TIME_TO_SEC(t.event_date) >= inter.begin AND TIME_TO_SEC(t.event_date) < inter.end -- типичный случай, определяем время начала интервала
then SEC_TO_TIME(floor((TIME_TO_SEC(t.event_date) - inter.begin) / inter.width) * inter.width + inter.begin)
when TIME_TO_SEC(t.event_date) = inter.end -- особый случай, определяем правильное время начала интервала ровно на окончании дневного периода
then SEC_TO_TIME(floor((TIME_TO_SEC(t.event_date) - inter.begin - 1) / inter.width) * inter.width + inter.begin)
when TIME_TO_SEC(t.event_date) < inter.begin -- если за пределами дневного периода, то время окончания за-null-яем
OR TIME_TO_SEC(t.event_date) > inter.end
then null
else null -- экстраситуация, если when-then охватывают все условия, то сюда никогда не попадем
end as full_interval_begin,
case
when TIME_TO_SEC(t.event_date) >= inter.begin AND TIME_TO_SEC(t.event_date) < inter.end -- типичный случай, определяем время окончания интервала
then SEC_TO_TIME(ceil((TIME_TO_SEC(t.event_date) - inter.begin + 1) / inter.width) * inter.width + inter.begin)
when TIME_TO_SEC(t.event_date) = inter.end -- особый случай, определяем правильное время окончания интервала ровно на окончании дневного периода
then SEC_TO_TIME(ceil((TIME_TO_SEC(t.event_date) - inter.begin - 1) / inter.width) * inter.width + inter.begin)
when TIME_TO_SEC(t.event_date) < inter.begin -- если за пределами дневного периода, то время окончания за-null-яем
OR TIME_TO_SEC(t.event_date) > inter.end
then null
else null -- экстраситуация, если when-then охватывают все условия, то сюда никогда не попадем
end as full_interval_end
FROM (select STR_TO_DATE('01.06.2018 09:59:00', '%d.%m.%Y %H:%i:%s') event_date) t, -- после дневного периода
(select TIME_TO_SEC('09:00:00') as begin, -- начало дневного периода
TIME_TO_SEC('18:00:00') as end, -- окончание дневного периода
TIME_TO_SEC('00:10:00') as width -- ширина интервала
) inter
на выходе таблица с полями: event_date 01.06.2018 10:00:00,
as full_interval_number - 6,
full_interval_begin - 09:50:00,
full_interval_end - 10:00:00
То есть выводит номер последнего интервала с его временными рамками.
Вопрос как вывести всё количество интервалов, 1,2,3..6
Код не мой, в sql не сильна, но очень надо. Заранее благодарю.