powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выборка периодов с разбивкой на даты
6 сообщений из 6, страница 1 из 1
Выборка периодов с разбивкой на даты
    #39898373
kjt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kjt
Гость
Доброго времени суток, коллеги!
Есть таблица в которой хранится прайс лист с наименованиями товара и периодом действия:
Код: sql
1.
select name, dateFrom, dateTo from TABLE



Товар 1 2019-01-17 00:00:00.000 2019-01-20 00:00:00.000
Товар 2 2019-01-18 00:00:00.000 2019-01-19 00:00:00.000
Товар 3 2019-01-29 00:00:00.000 2019-01-30 00:00:00.000

Нужно как то периоды разбить на даты и получить результат в таком виде:
Товар 1 2019-01-17 00:00:00.000
Товар 1 2019-01-18 00:00:00.000
Товар 1 2019-01-19 00:00:00.000
Товар 1 2019-01-20 00:00:00.000
Товар 2 2019-01-18 00:00:00.000
Товар 2 2019-01-19 00:00:00.000
Товар 3 2019-01-29 00:00:00.000
Товар 3 2019-01-30 00:00:00.000

Видел много решений по разбивке периодов, но не могу понять как эти функции интегрировать в запрос.
Подскажите красивое решение.
...
Рейтинг: 0 / 0
Выборка периодов с разбивкой на даты
    #39898376
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kjt,
Пока всё равно все спецы спят, так что напишу я.

В общем случае надо таблицу (сгенерированную) с датами, тупо 1 день за запись. Потом берешь и связываешь:
Код: sql
1.
select a.name, b.date from a,b where b.date between a.datefrom and a.dateto


Хотя в mssql может быть есть для такого специальный костыль.
...
Рейтинг: 0 / 0
Выборка периодов с разбивкой на даты
    #39898379
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kjt,

https://www.sqlshack.com/how-to-generate-random-sql-server-test-data-using-t-sql/
А сам генератор дат делается через рекурсивный запрос т.е. через жопу. Но тут всё делается так. Это нормально.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with seq
    as(
       select 1 id
        union  all
        select id + 1
        from seq
        where 
          id < 1000
      )
   
 select * from seq OPTION(MAXRECURSION 0)


Дату заместо id сделай сам, у меня нет mssql под рукой.
...
Рейтинг: 0 / 0
Выборка периодов с разбивкой на даты
    #39898381
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kjt,

Код: sql
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.
DECLARE
  @Begin date = '20190101',
  @End   date = '20190131';

DECLARE @t AS TABLE (tovar NVARCHAR(10), bg  DATETIME, en  DATETIME)
INSERT INTO @t VALUES 
(N'Товар 1', '2019-01-17 00:00:00.000', '2019-01-20 00:00:00.000'),
(N'Товар 2', '2019-01-18 00:00:00.000', '2019-01-19 00:00:00.000'),
(N'Товар 3', '2019-01-29 00:00:00.000', '2019-01-30 00:00:00.000')
SELECT * FROM @t t  

;WITH x AS
(
	SELECT 
		ROW_NUMBER() OVER (ORDER BY 1/0) AS num
	FROM master..spt_values
),
d AS 
(SELECT 
	CAST(DATEADD(day, x.num - 1, @Begin) as DATE) date
FROM x
WHERE CAST(DATEADD(day,x.num,@Begin) as DATE) <= @End
)
SELECT * FROM @t t CROSS APPLY d 
WHERE d.date >= t.bg AND d.date <= t.en 
...
Рейтинг: 0 / 0
Выборка периодов с разбивкой на даты
    #39898382
kjt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kjt
Гость
Massa52,

Благодарю!
...
Рейтинг: 0 / 0
Выборка периодов с разбивкой на даты
    #39898407
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
WITH 
cte AS ( SELECT name, dateFrom [date], dateTo
         FROM [TABLE]
         /* WHERE dateFrom <= dateTo */
     UNION ALL
         SELECT name, DATEADD(day, 1, [date]), dateTo
         FROM cte
         WHERE [date] < dateTo
)
SELECT name, [date]
FROM cte
ORDER BY 1,2


fiddle
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Выборка периодов с разбивкой на даты
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]