こんにちは、SQL Server 2008 は初めてです
単一の行を別の列に基づいて複数の行に展開したい、
例えば
date value
7-2011 5
結果:
2011-07-01
2011-08-01
2011-09-01
2011-10-01
2012-11-01
日付は、現在の月と翌月の最初の日である必要があり、5 回繰り返されます
こんにちは、SQL Server 2008 は初めてです
単一の行を別の列に基づいて複数の行に展開したい、
例えば
date value
7-2011 5
結果:
2011-07-01
2011-08-01
2011-09-01
2011-10-01
2012-11-01
日付は、現在の月と翌月の最初の日である必要があり、5 回繰り返されます
試す:
DECLARE @YourTable table (YourDate datetime, value int)
insert into @YourTable VALUES ('2011-7-12',5)
;WITH AllNumbers AS
(
SELECT 0 AS Number
UNION ALL
SELECT Number+1
FROM AllNumbers
WHERE Number<4
)
SELECT
dateadd(month,number,DATEADD(month,DATEDIFF(month,0,YourDate),0))
FROM @YourTable y
INNER JOIN AllNumbers a ON 1=1
出力:
-----------------------
2011-07-01 00:00:00.000
2011-08-01 00:00:00.000
2011-09-01 00:00:00.000
2011-10-01 00:00:00.000
2011-11-01 00:00:00.000
(5 row(s) affected)
テーブル内の複数の行で機能します。こちらを参照してください。
DECLARE @YourTable table (YourDate datetime, ValueOf int)
insert into @YourTable VALUES ('2011-7-12',5)
insert into @YourTable VALUES ('2012-4-24',6)
;WITH AllNumbers AS
(
SELECT 0 AS Number
UNION ALL
SELECT Number+1
FROM AllNumbers
WHERE Number<4
)
SELECT
y.ValueOf
,dateadd(month,number,DATEADD(month,DATEDIFF(month,0,y.YourDate),0))
FROM @YourTable y
INNER JOIN AllNumbers a ON 1=1
ORDER BY 1,2
出力:
ValueOf
----------- -----------------------
5 2011-07-01 00:00:00.000
5 2011-08-01 00:00:00.000
5 2011-09-01 00:00:00.000
5 2011-10-01 00:00:00.000
5 2011-11-01 00:00:00.000
6 2012-04-01 00:00:00.000
6 2012-05-01 00:00:00.000
6 2012-06-01 00:00:00.000
6 2012-07-01 00:00:00.000
6 2012-08-01 00:00:00.000
(10 row(s) affected)
また、私は SQL Server 2008 を利用できDATE
ないので、datetime を使用しました。
dateadd(month,number,y.YourDate)
create function addMonths(@date date, @limit int)
returns @date_table TABLE(
myDate date
)
AS
begin
declare @cont int
set @cont = 1
while (@cont <= @limit) begin
insert into @date_table values(DATEADD(MONTH,@cont,@date))
set @cont=@cont+1
end
return
end
利用方法:
select * from addMonths(GETDATE(),5)
編集:
create table mydates(
myDate date,
inc_months int)
insert into mydates values ('01/01/2005',3)
insert into mydates values ('01/01/2006',5)
select AM.mydate
from mydates MD cross apply addMonths(MD.mydate,MD.inc_months) AM
結果:
2005-02-01
2005-03-01
2005-04-01
2006-02-01
2006-03-01
2006-04-01
2006-05-01
2006-06-01