разделение timeFrom и timeTo на часовые интервалы

У меня есть следующее:

TimeFrom                    TimeTo
2015-08-04 11:00:00.000     2015-08-04 14:00:00.000
2015-08-04 18:00:00.000     2015-08-04 20:00:00.000
2015-08-04 21:00:00.000     2015-08-04 23:00:00.000

Я хочу создать что-то, что даст мне все часовые интервалы. Вот так:

TimeFrom                    TimeTo
2015-08-04 11:00:00.000     2015-08-04 12:00:00.000
2015-08-04 12:00:00.000     2015-08-04 13:00:00.000
2015-08-04 13:00:00.000     2015-08-04 14:00:00.000
2015-08-04 18:00:00.000     2015-08-04 19:00:00.000
2015-08-04 19:00:00.000     2015-08-04 20:00:00.000
2015-08-04 21:00:00.000     2015-08-04 22:00:00.000
2015-08-04 22:00:00.000     2015-08-04 23:00:00.000

Есть ли простой способ добиться этого? Кажется, что-то, что должно быть довольно распространенным, но не смог найти ничего, относящегося к этому.

У меня записи за много дней, почти за год. Все отдельные записи (timeFrom, timeTo) относятся к одному дню (они не охватывают несколько дней).

Я использую PrestoDB


person Javier    schedule 23.11.2015    source источник
comment
Возможно ли, что интервал охватывает два разных дня, например (TimeFrom, TimeTo) = (2015-08-04 11:00:00.000, 2015-08-05 03:00:00.000)?   -  person Giorgos Betsos    schedule 24.11.2015
comment
нет, это невозможно в этом наборе данных.   -  person Javier    schedule 24.11.2015


Ответы (2)


Вы можете использовать таблицу чисел:

SELECT DATE_ADD('HOUR', i - 1, TimeFrom) AS TimeFrom, 
       DATE_ADD('HOUR', i, TimeFrom) AS TimeTo
FROM (SELECT 1 AS i UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
      UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8
      UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
      UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 UNION ALL SELECT 16
      UNION ALL SELECT 17 UNION ALL SELECT 18 UNION ALL SELECT 19 UNION ALL SELECT 20
      UNION ALL SELECT 21 UNION ALL SELECT 22 UNION ALL SELECT 23 UNION ALL SELECT 24
) AS numbers
INNER JOIN mytable ON numbers.i <= DATE_DIFF('HOUR', TimeFrom, TimeTo)
ORDER BY TimeFrom

Примечание. В приведенном выше запросе используются DATE_ADD и DATE_DIFF функции даты и времени, задокументированные здесь для PrestoDB.

person Giorgos Betsos    schedule 23.11.2015
comment
Большой! Что такое mytable — это сам подзапрос? Где бы я определил этот подзапрос? Могу ли я просто подключить его туда, где mytable находится выше? Извините, новичок в синтаксисе SQL. - person Javier; 24.11.2015
comment
@Javier mytable - это просто ваша таблица, а не подзапрос. - person Giorgos Betsos; 24.11.2015
comment
я имел в виду, что, если * извините. Скажем, это подзапрос. - person Javier; 24.11.2015
comment
@Javier В этом случае да, вы можете использовать его вместо mytable и использовать псевдоним, например INNER JOIN (SELECT TimeFrom, TimeTo FROM ... ) AS mytable ON numbers.i <= DATE_DIFF(HOUR, TimeFrom, TimeTo). - person Giorgos Betsos; 24.11.2015
comment
Я продолжаю получать: Столбец «час» не может быть разрешен в этой строке: DATE_DIFF (HOUR, TimeFrom, TimeTo) - person Javier; 24.11.2015
comment
@Javier У меня нет опыта работы с PrestoDB. Я попытался ответить на основе онлайн-руководства, которое я нашел. Попробуйте настроить функции даты и времени моего запроса, используя любое справочное руководство используемой вами системы. - person Giorgos Betsos; 24.11.2015
comment
@Javier Это, где я читал о DATE_ADD, DATE_DIFF функциях. - person Giorgos Betsos; 25.11.2015
comment
Спасибо, я понял, что происходит. единица измерения должна быть передана в виде строки. - person Javier; 25.11.2015
comment
@ Хавьер Рад, что у тебя все получилось. Я отредактировал свой ответ, чтобы передать единицы времени в виде строк. Теперь нормально? - person Giorgos Betsos; 25.11.2015
comment
Если у вас есть время, вы будете признательны за помощь с более сложным запросом, который включает следующее: stackoverflow.com/questions/33906932/ - person Javier; 25.11.2015

Я не вижу способа добиться этого, не имея еще одной таблицы, которая будет перечисляться каждый час. Если вы ограничены одним днем, вы можете подделать его, встроив его в свой запрос, используя UNION ALL.

SELECT h.Hour
  FROM ( SELECT 2015-08-04 00:00:00.000 AS Hour
         UNION ALL SELECT 2015-08-04 01:00:00.000    
         UNION ALL SELECT 2015-08-04 02:00:00.000  
         UNION ALL SELECT 2015-08-04 03:00:00.000  
         UNION ALL SELECT 2015-08-04 04:00:00.000  
         UNION ALL SELECT 2015-08-04 05:00:00.000  
         UNION ALL SELECT 2015-08-04 06:00:00.000  
         UNION ALL SELECT 2015-08-04 07:00:00.000  
         UNION ALL SELECT 2015-08-04 08:00:00.000  
         UNION ALL SELECT 2015-08-04 09:00:00.000  
         UNION ALL SELECT 2015-08-04 10:00:00.000  
         UNION ALL SELECT 2015-08-04 11:00:00.000 
         UNION ALL SELECT 2015-08-04 12:00:00.000 
         UNION ALL SELECT 2015-08-04 13:00:00.000 
         UNION ALL SELECT 2015-08-04 14:00:00.000 
         UNION ALL SELECT 2015-08-04 15:00:00.000 
         UNION ALL SELECT 2015-08-04 16:00:00.000 
         UNION ALL SELECT 2015-08-04 17:00:00.000 
         UNION ALL SELECT 2015-08-04 18:00:00.000 
         UNION ALL SELECT 2015-08-04 19:00:00.000 
         UNION ALL SELECT 2015-08-04 20:00:00.000 
         UNION ALL SELECT 2015-08-04 21:00:00.000 
         UNION ALL SELECT 2015-08-04 22:00:00.000 
         UNION ALL SELECT 2015-08-04 23:00:00.000 ) AS h
where exists 
(select id from mytable where h>=TimeFrom and h<=TimeTo)
person Anton    schedule 23.11.2015
comment
Я не ограничиваюсь одним днем. Как я мог сделать это с другой таблицей? Извините, я новичок в SQL. Вы имеете в виду присоединение? - person Javier; 24.11.2015