Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Разбить временной отрезок по месяцам  [new]
SQLnoob111
Guest
Подскажите пожалуйста, как из отрезка даты (@Begin, @End) получить все отрезки с начала месяца.

Например есть переменные
DECLARE
  @Begin date = '2018-01-21',
  @End   date = '2018-03-12'



Хочутся получить таблицу с тремя записи:
'2018-01-21', '2018-01-31'
'2018-02-01', '2018-02-28'
'2018-03-01', '2018-03-12'
14 мар 18, 11:03    [21254655]     Ответить | Цитировать Сообщить модератору
 Re: Разбить временной отрезок по месяцам  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
Календарь ? не знаю, такое
14 мар 18, 11:06    [21254673]     Ответить | Цитировать Сообщить модератору
 Re: Разбить временной отрезок по месяцам  [new]
.Евгений
Member

Откуда:
Сообщений: 493
...рекурсия, цикл, размножающая строки таблица...
14 мар 18, 11:22    [21254731]     Ответить | Цитировать Сообщить модератору
 Re: Разбить временной отрезок по месяцам  [new]
iap
Member

Откуда: Москва
Сообщений: 46953
DECLARE
  @Begin date = '2018-01-21',
  @End   date = '2018-03-12';
WITH Periods(DateBegin,DateEnd) AS
(
 SELECT @Begin,CAST(CASE WHEN @End<DATEADD(DAY,-1,DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Begin),0)) THEN @End ELSE DATEADD(DAY,-1,DATEADD(MONTH,1+DATEDIFF(MONTH,0,@Begin),0)) END AS DATE)
 UNION ALL
 SELECT CAST(DATEADD(MONTH,1+DATEDIFF(MONTH,0,DateBegin),0) AS DATE),CAST(CASE WHEN @End<DATEADD(DAY,-1,DATEADD(MONTH,2+DATEDIFF(MONTH,0,DateBegin),0)) THEN @End ELSE DATEADD(DAY,-1,DATEADD(MONTH,2+DATEDIFF(MONTH,0,DateBegin),0)) END AS DATE)
 FROM Periods
 WHERE DateEnd<@End
)
SELECT * FROM Periods;
14 мар 18, 11:24    [21254745]     Ответить | Цитировать Сообщить модератору
 Re: Разбить временной отрезок по месяцам  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
если есть таблица чисел то упростится.Если нет

DECLARE
  @Begin date = '2018-01-21',
  @End   date = '2018-03-12';

WITH x(Id) AS
(
	SELECT 
		ROW_NUMBER() OVER (ORDER BY 1/0)
	FROM master..spt_values
) 
SELECT 
	CAST(DATEADD(month,x.Id,0) as DATE), 
	EOMONTH(DATEADD(month,x.Id,0))
FROM x
WHERE x.Id BETWEEN DATEDIFF(month,0,@Begin) AND DATEDIFF(month,0,@END) 
14 мар 18, 11:28    [21254769]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить