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

Откуда:
Сообщений: 43
Всем привет! Собственно к проблеме....
Задан период дат (начало, конец):
declare @DateBegin datetime
declare @DateEnd   datetime

set @DateBegin = '20110201'
set @DateEnd   = '20120601'


Получить нужно следующее:
Mes.God
2.2011
3.2011
...
6.2012

То есть, перебрать все месяца + год за заданный период.
Никак не могу придумать универсальный вариант, работающий с любым заданным периодом.
Заранее спасибо!
8 фев 12, 11:31    [12052335]     Ответить | Цитировать Сообщить модератору
 Re: Все месяца+год за период  [new]
Glory
Member

Откуда:
Сообщений: 104751
MrBlackJack
Никак не могу придумать универсальный вариант, работающий с любым заданным периодом.

Таблица-каледарь
8 фев 12, 11:34    [12052365]     Ответить | Цитировать Сообщить модератору
 Re: Все месяца+год за период  [new]
месяц
Guest
WHILE (@DateBegin<= @DateEnd)
BEGIN
      INSERT INTO #T(DateBegin)
      SELECT @DateBegin
      SET @DateBegin=DATEADD(m,1,@DateBegin)
END
8 фев 12, 11:34    [12052369]     Ответить | Цитировать Сообщить модератору
 Re: Все месяца+год за период  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
declare @DateBegin datetime;
declare @DateEnd   datetime;

set @DateBegin = '20110201';
set @DateEnd   = '20120601';

with cte
as
(
select dateadd( m, 1, @DateBegin) dt
union all
select dateadd( m, 1, dt ) from cte where dt <= @DateEnd
)

select * from cte;
8 фев 12, 11:36    [12052378]     Ответить | Цитировать Сообщить модератору
 Re: Все месяца+год за период  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Knyazev Alexey
declare @DateBegin datetime;
declare @DateEnd   datetime;

set @DateBegin = '20110201';
set @DateEnd   = '20120601';

with cte
as
(
select dateadd( m, 1, @DateBegin) dt
union all
select dateadd( m, 1, dt ) from cte where dt <= @DateEnd
)

select * from cte;


with cte
as
(
select dateadd( m, 0, @DateBegin) dt
union all
select dateadd( m, 1, dt ) from cte where dt < @DateEnd
)

select * from cte
8 фев 12, 11:37    [12052389]     Ответить | Цитировать Сообщить модератору
 Re: Все месяца+год за период  [new]
MrBlackJack
Member

Откуда:
Сообщений: 43
Glory, Спасибо, очевидные вещи, не всегда очевидны)) Почему я сам - то об этом не догадался)...Но это уже философия, еще раз спасибо!
8 фев 12, 11:38    [12052403]     Ответить | Цитировать Сообщить модератору
 Re: Все месяца+год за период  [new]
iljy
Member

Откуда:
Сообщений: 8711
MrBlackJack,

declare @DateBegin datetime
declare @DateEnd   datetime

set @DateBegin = '20110201'
set @DateEnd   = '20120601'


select dateadd(MM, number, @DateBegin)
from master..spt_values
where type = 'P' and number between 0 and DATEDIFF(mm, @DateBegin, @DateEnd)
8 фев 12, 11:39    [12052414]     Ответить | Цитировать Сообщить модератору
 Re: Все месяца+год за период  [new]
MrBlackJack
Member

Откуда:
Сообщений: 43
Knyazev Alexey, и вам спасибо, отличный вариант! Теперь у меня много вариантов решения моей проблемы..
Всем спасибо, тема закрыта!
8 фев 12, 11:42    [12052445]     Ответить | Цитировать Сообщить модератору
 Re: Все месяца+год за период  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
declare @DateBegin datetime
declare @DateEnd   datetime
set @DateBegin = '20110201'
set @DateEnd   = '20120601'
SELECT * FROM (
SELECT  TOP 97199 DATEADD(MONTH,ROW_NUMBER() OVER (ORDER BY (SELECT 1)),0) dd
FROM    master..spt_values v1,
        master..spt_values v2
) t
WHERE t.dd BETWEEN @DateBegin AND @DateEnd
8 фев 12, 11:47    [12052495]     Ответить | Цитировать Сообщить модератору
 Re: Все месяца+год за период  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Glory
Таблица-каледарь
Чего-то вспомнилось...
календарь нынешнего месяца

5213452
SET NOCOUNT ON;
DECLARE @Language NVARCHAR(4000);
SET @Language=@@LANGUAGE;
IF @@LANGUAGE<>N'русский' SET LANGUAGE Russian;
DECLARE @Y CHAR(4);
SET @Y='2012';
PRINT 'КАЛЕНДАРЬ НА '+@Y+' ГОД';
PRINT '---------------------';
SELECT LEFT(CASE(D-1+(@@DATEFIRST+DATEPART(WEEKDAY,DATEADD(MONTH,M-1,@Y))-2)%7)/7 WHEN 0 THEN MN ELSE''END,8),
 MAX(ISNULL(CASE WD WHEN 2 THEN STR(D)END,''))[Пн],
 MAX(ISNULL(CASE WD WHEN 3 THEN STR(D)END,''))[Вт],
 MAX(ISNULL(CASE WD WHEN 4 THEN STR(D)END,''))[Ср],
 MAX(ISNULL(CASE WD WHEN 5 THEN STR(D)END,''))[Чт],
 MAX(ISNULL(CASE WD WHEN 6 THEN STR(D)END,''))[Пт],
 MAX(ISNULL(CASE WD WHEN 0 THEN STR(D)END,''))[Сб],
 MAX(ISNULL(CASE WD WHEN 1 THEN STR(D)END,''))[Вс]
FROM
(
 SELECT
  M.number+1,
  DATENAME(MONTH, DATEADD(MONTH,M.number,@Y)),
  MD.number+1,
  (@@DATEFIRST+DATEPART(WEEKDAY, DATEADD(DAY,MD.number, DATEADD(MONTH,M.number,@Y))))%7
 FROM master.dbo.spt_values M
 JOIN master.dbo.spt_values MD
 ON MD.number<DATEDIFF(DAY, DATEADD(MONTH,M.number,@Y), DATEADD(MONTH,M.number+1,@Y))
 WHERE M.[type]='P' AND M.number<12 AND MD.[type]='P'
) T(M,MN,D,WD)
GROUP BY M,MN,(D-1+(@@DATEFIRST+DATEPART(WEEKDAY, DATEADD(MONTH,M-1,@Y))-2)%7)/7
ORDER BY M,(D-1+(@@DATEFIRST+DATEPART(WEEKDAY, DATEADD(MONTH,M-1,@Y))-2)%7)/7;
IF @@LANGUAGE<>@Language SET LANGUAGE @Language;

5242946
SET NOCOUNT ON;
DECLARE @FromYear CHAR(4),@ToYear CHAR(4),@FromMonth TINYINT,@ToMonth TINYINT;
SELECT @FromYear='2012',@ToYear='2013',@FromMonth=1,@ToMonth=12;
DECLARE @Language NVARCHAR(4000);
SET @Language=@@LANGUAGE;
IF @@LANGUAGE<>N'русский' SET LANGUAGE Russian;
WITH Years(Y) AS (SELECT @FromYear UNION ALL SELECT CAST(Y+1 AS CHAR(4))FROM Years WHERE Y<@ToYear)
,Monthes(Y,M,N) AS (SELECT Y,@FromMonth-1, DATENAME(MONTH, DATEADD(MONTH,@FromMonth-1,Y)) FROM Years UNION ALL SELECT Y,M+1, DATENAME(MONTH, DATEADD(MONTH,M+1,Y)) FROM Monthes WHERE M<@ToMonth-1)
,Dates(Y,M,D,DD,N) AS (SELECT Y,M,0, DATEADD(MONTH,M,Y),N FROM Monthes UNION ALL SELECT Y,M,D+1, DATEADD(DAY,1,DD),N FROM Dates WHERE D<DATEDIFF(DAY, DATEADD(MONTH,M,Y), DATEADD(MONTH,M+1,Y))-1)
,WeekDays(Y,M,D,WD,N,WNo) AS (SELECT Y,M+1, RIGHT(STR(D+1),2),(@@DATEFIRST+DATEPART(WEEKDAY,DD))%7,N,(D+(@@DATEFIRST+DATEPART(WEEKDAY, DATEADD(MONTH,M,Y))-2)%7)/7 FROM Dates)
,Calendar AS
(
 SELECT Y,M,WNo
 ,CASE WHEN WNo=0 AND M=@FromMonth THEN Y ELSE''END[Год]
 ,LEFT(CASE WNo WHEN 0 THEN CASE M WHEN 1 THEN REPLICATE('=',8)ELSE REPLICATE('-',8)END WHEN 2 THEN N ELSE''END,8)[Месяц]
 ,ISNULL([2],'')[Пн]
 ,ISNULL([3],'')[Вт]
 ,ISNULL([4],'')[Ср]
 ,ISNULL([5],'')[Чт]
 ,ISNULL([6],'')[Пт]
 ,ISNULL('['+[0]+']','')[Сб]
 ,ISNULL('['+[1]+']','')[Вс]
 FROM WeekDays PIVOT (MAX(D) FOR WD IN([0],[1],[2],[3],[4],[5],[6])) Pvt
)
SELECT [Год],[Месяц],[Пн],[Вт],[Ср],[Чт],[Пт],[Сб],[Вс] FROM Calendar ORDER BY Y,M,WNo OPTION(MAXRECURSION 0);
IF @@LANGUAGE<>@Language SET LANGUAGE @Language;
8 фев 12, 12:05    [12052680]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить