Есть таблица с полей b_datetime(datetime).
Данные пишутся с точностью до секунды, но есть промежутки в одну и более секунд:
1900-01-01 16:20:00
1900-01-01 16:20:01
1900-01-01 16:20:02
1900-01-01 16:20:05
1900-01-01 16:20:09
Возможно ли сгенерировать(выбрать) в одном селекте (без создания [DDL] доп таблиц и обращения к системным таблицам и использования функций, процедур)
с произвольного момента без использования СТЕ непрерывную посекундную последовательность длительностью к примеру 30 секунд:
1900-01-01 16:20:00
1900-01-01 16:20:01
1900-01-01 16:20:02
1900-01-01 16:20:03
1900-01-01 16:20:04
1900-01-01 16:20:05
1900-01-01 16:20:06
1900-01-01 16:20:07
.
.
.
1900-01-01 16:20:30
Здравствуйте, InCodeWeTrust, Вы писали:
ICW>Возможно ли сгенерировать(выбрать) с поизвольного момента без использования СТЕ непрерывную посекундную последовательность длительностью к примеру 30 секунд:
СУБД — SQL Server, нужно полагать?
Я бы сказал, что здесь ключевое сгенерировать последовательность чисел 1..N, а потом ее можно легко сконвертировать в дату-время через DATEADD(SECOND, ...)
Вариантов как сгенерировать последовательность чисел без CTE — много.
Можно, например, просто создать фиксированную таблицу Numbers с последовательность чисел, а потом ее использовать вроде:
SELECT
DATEADD(SECOND, N.Num, YT.b_datetime)
FROM
dbo.YourTable YT
INNER JOIN
dbo.Numbers N ON N.Num BETWEEN 1 AND 30
WHERE
YT.b_datetime = ?
ORDER BY
1
Можно сделать table функцию, которая будет возравщать такую последовательность:
CREATE FUNCTION dbo.fn_NumbersSequence(@Start INT, @End INT)
RETURNS TABLE
RETURN
SELECT
ones.n + 10 * tens.n AS Num
FROM
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) ones(n),
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) tens(n)
WHERE
ones.n + 10*tens.n BETWEEN @Start AND @End
GO
SELECT
DATEADD(SECOND, F.Num, YT.b_datetime)
FROM
dbo.YourTable YT
CROSS APPLY
dbo.fn_NumbersSequence(1, 30) F
WHERE
YT.b_datetime = ?
ORDER BY
1
Может в новых версиях SQL Server есть уже специальные ф-ции для этого.