Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как разбить общий временной интервал на части?  [new]
Gizmor
Member

Откуда:
Сообщений: 54
Доброго времени суток,
наверняка тема обсуждалась, но найти не смог.
Есть дата и время начала интервала, дата и время окончания интервала и период разбивки.
Нужно получить временные интервальчики, которые разбивают общий.
Пример.
Время начала - 06:00 11.12.2013
Время окончания - 10:00 11.12.2013
Период разбивки - 1 час.

Нужно получить временный запрос, чтобы на него потом понавесить информацию.

Время начала Время окончания
06:00 11.12.2013 07:00 11.12.2013
07:00 11.12.2013 08:00 11.12.2013
08:00 11.12.2013 09:00 11.12.2013
09:00 11.12.2013 10:00 11.12.2013

Заранее благодарен!!!
11 дек 13, 08:49    [15274827]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить общий временной интервал на части?  [new]
mr.dfox
Member

Откуда: Где где .. в караганде
Сообщений: 538
Gizmor
Доброго времени суток,
наверняка тема обсуждалась, но найти не смог.
Есть дата и время начала интервала, дата и время окончания интервала и период разбивки.
Нужно получить временные интервальчики, которые разбивают общий.
Пример.
Время начала - 06:00 11.12.2013
Время окончания - 10:00 11.12.2013
Период разбивки - 1 час.

Нужно получить временный запрос, чтобы на него потом понавесить информацию.

Время начала Время окончания
06:00 11.12.2013 07:00 11.12.2013
07:00 11.12.2013 08:00 11.12.2013
08:00 11.12.2013 09:00 11.12.2013
09:00 11.12.2013 10:00 11.12.2013

Заранее благодарен!!!



Курсором не устраивает?
11 дек 13, 08:53    [15274842]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить общий временной интервал на части?  [new]
Gizmor
Member

Откуда:
Сообщений: 54
Возможно и устроит, а какие тогда будут ограничения?
11 дек 13, 09:00    [15274854]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить общий временной интервал на части?  [new]
mr.dfox
Member

Откуда: Где где .. в караганде
Сообщений: 538
Gizmor,

Сори я не правильно понял задачу..

Как такой вариант - оформить в виде процедуры с входными параметрами:

CREATE PROCEDURE dbo.timeint
@dts datetime,
@dte datetime
AS
BEGIN

DECLARE @dtnext datetime
DECLARE @dtTable TABLE (dt datetime)

IF NOT @dts>=@dte
BEGIN
	SET @dtnext=@dts
	WHILE @dtnext<=@dte
	BEGIN
	insert into @dtTable
	SELECT @dtnext
	SET @dtnext=DATEADD(Hour,1, @dtnext)
	print @dtnext
	END
END

select * FROM @dtTable
 
11 дек 13, 09:13    [15274905]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить общий временной интервал на части?  [new]
kalakhary
Member

Откуда:
Сообщений: 17
mr.dfox, могу предложить такой вариант
create table #t (d_beg datetime, d_end datetime)
insert into #t values ('06:00 11.12.2013', '10:00 11.12.2013')

;WITH cte(d_beg, d_end, Lev) AS 
(
    SELECT d_beg, d_end, 0 as Lev
    FROM #t
    UNION ALL
	SELECT dateadd(hh, 1, cte.d_beg), cte.d_end, Lev + 1 from cte
	where cte.d_beg<d_end
)
SELECT a1.d_beg , a2.d_beg FROM cte a1 
	left join cte a2 on a1.Lev = a2.Lev-1 where a2.Lev is not null

drop table #t 
11 дек 13, 09:22    [15274945]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить общий временной интервал на части?  [new]
Gizmor
Member

Откуда:
Сообщений: 54
Спасибо, ребята!
Оба варианта отличные. Я решил применить с СТЕ, так как не нужно создавать лишний объект базы - хранимую процедуру.
Искренне благодарен!!!
11 дек 13, 09:36    [15275029]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить общий временной интервал на части?  [new]
mr.dfox
Member

Откуда: Где где .. в караганде
Сообщений: 538
Gizmor
Спасибо, ребята!
Оба варианта отличные. Я решил применить с СТЕ, так как не нужно создавать лишний объект базы - хранимую процедуру.
Искренне благодарен!!!


А почему с СТЕ выдает ошибку при разбивке на более чем 100 записей?
11 дек 13, 09:41    [15275055]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить общий временной интервал на части?  [new]
kalakhary
Member

Откуда:
Сообщений: 17
mr.dfox,
Потому что не задана опция
 OPTION (MAXRECURSION count_recursion); 
, а значение по умолчанию = 100
11 дек 13, 09:46    [15275078]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить общий временной интервал на части?  [new]
kalakhary
Member

Откуда:
Сообщений: 17
если вам нужно убрать ограничение, поставьте после
SELECT a1.d_beg , a2.d_beg FROM cte a1 
	left join cte a2 on a1.Lev = a2.Lev-1 where a2.Lev is not null
OPTION (MAXRECURSION 0);
11 дек 13, 09:48    [15275096]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить общий временной интервал на части?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Рекурсии развращают
Это простейшая задача соединения с таблицей последовательных чисел
select 
* 
from #t a 
inner join
(select 1 as nr
 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) b
on b.nr between datepart(hh, d_beg) and datepart(hh, d_end)
11 дек 13, 10:26    [15275330]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить общий временной интервал на части?  [new]
mr.dfox
Member

Откуда: Где где .. в караганде
Сообщений: 538
Glory
Рекурсии развращают
Это простейшая задача соединения с таблицей последовательных чисел
select 
* 
from #t a 
inner join
(select 1 as nr
 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) b
on b.nr between datepart(hh, d_beg) and datepart(hh, d_end)


А как решить с переходом с суток на сутки?
11 дек 13, 10:52    [15275490]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить общий временной интервал на части?  [new]
Glory
Member

Откуда:
Сообщений: 104751
mr.dfox
А как решить с переходом с суток на сутки?

В каждых сутках есть всегда 24 часа
11 дек 13, 10:55    [15275507]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить общий временной интервал на части?  [new]
kalakhary
Member

Откуда:
Сообщений: 17
Glory, а если период будет переходным через сутки?
11 дек 13, 10:56    [15275510]     Ответить | Цитировать Сообщить модератору
 Re: Как разбить общий временной интервал на части?  [new]
Glory
Member

Откуда:
Сообщений: 104751
kalakhary
Glory, а если период будет переходным через сутки?

Тогда надо будет посравнивать текущий номер с разностью дат в часах
11 дек 13, 11:04    [15275549]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить