2015-11-23 2 views
0

я следующее:раскалывается 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

+0

Возможно, что интервал охватывает два разных дня, например '(TimeFrom, TimeTo)' = '(2015-08-04 11: 00: 00.000, 2015-08-05 03: 00: 00.000)'? –

+0

нет в этом наборе данных невозможно. – Javier

ответ

0

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

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 документация даты и времени here для PrestoDB.

+0

Отлично! Что такое «mytable» - это сам подзапрос? Где я могу определить этот подзапрос? Могу ли я просто подключить его к тому, где «mytable» выше? Извините за новый синтаксис SQL. – Javier

+0

@Javier 'mytable' - это просто ваш стол, а не подзапрос. –

+0

i предназначенный что если * извините. Скажем, что это подзапрос. – Javier

0

Я не вижу, как добиться, не имея другой стол, который будет перечислять каждый час. Если вы ограничены в один день вы можете подделать его constructin его в запросе с помощью 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) 
+0

Я не ограничен одним днем. Как я мог сделать это с другой таблицей? Извините, я новичок в SQL. Вы имеете в виду присоединение? – Javier