2017-04-20 72 views
1

我需要用簡單的(年,月,日)列填充一個表,長達10年,我大致每個月有30天。它看起來像下面。SQL函數來填充一個簡單的日期表

我已經寫了下面的代碼來填充表,但我有錯誤的第二「而」它說「期待‘(’,或選擇」。任何線索,爲什麼?

Simple Date table

declare @month varchar(20) 
    set @month ='1' 

    declare @day varchar(20) 
    set @day='1' 

    declare @sql nvarchar(1000) 
    while(@Year <=10) 
    (
     while(@month<=12) 
     ( 
      while(@day<= @day+30) 
       (
       insert into simple_table values(@Year,@month,@day) 
      @[email protected]+1 
     ) 
       @month+1 
     ) 
     @year = @year+1 
     ) 
     ) 
+1

你有一個額外的')' – TheGameiswar

+0

'而(@day <= @ day + 30)'永遠是真的...... –

+0

@TheGameiswar,啊!我刪除了最後一個額外的)仍然有同樣的錯誤。 – SKa

回答

1

隨着特設理貨表的幫助和交叉聯接(或兩個)

你的樣品是有點不清楚。這是假設日子列不是1-30 BU t 1-3600 10年。我假設你正在構建某種30/360

Select Year = 'Year'+cast(Y as varchar(25)) 
     ,Month = M 
     ,Day = Row_Number() over (Order by Y,M,D) 
From (Select Top (10) Y=Row_Number() Over (Order By (Select NULL)) From master..spt_values) Y 
Cross Join (Select Top (12) M=Row_Number() Over (Order By (Select NULL)) From master..spt_values) M 
Cross Join (Select Top (30) D=Row_Number() Over (Order By (Select NULL)) From master..spt_values) D 

收益攤銷時間表

enter image description here

+0

謝謝,約翰。我可能從來沒有想出這個解決方案。這正是我需要的。我認爲我們每年可以處理360天。 – SKa

+0

@SKa很高興幫助。兩件事情。 1)從不是一個大字2)嘗試思考SQL中的數據集而不是線性處理。 –

+0

@SKa每月和/或每年的實際日子的小調整隻需讓我知道 –

0

似乎將是一個更容易使用一個循環,而不是3

Declare @D DateTime; 

Set @D = GetDate(); 

while @D < DateAdd(Year, 10, GetDate()) 
    Begin 

     Insert Into simple_table(Year, Month, Day) Select Year(@D), Month(@D), Day(@D) 

     Set @D = DateAdd(Day, 1, @D) 

    End 

基本上,只需使用日期作爲循環變量,每次循環增加一天。額外的好處是,你每個月都能得到正確的天數(包括閏年)。

+0

謝謝@G Mastros。我需要一張普通桌子。如果我需要生成給定年份的日期表,這是一段很好的代碼。 – SKa