2010-08-19 51 views
0

我開發使用的SQLServer 2008作爲數據庫中的財務應用程序,我想生成例如任何一年的會計期間幫助創建會計年度的12個週期

輸入:2010年6月

結果所需的12個週期從2010年6月 - 2011年5月開始日期

期限...............。開始.............................. .... ......... ..結束 1 ... ... ...... ............ 1-06-2010 ................................. 30-06-2010 2 .......... 1-07-2010 ........ ... 31-07-2010

等等直到2010年5月...實際上需要從任何月份開始獲得12行(12個月),並且輸出將是月份的開始日期並且結束將是月份的最後一天,例如在我的情景2010年6月 - 2011年5月..什麼將是查詢。

由於提前

回答

1

下面是一個使用公共表表達式來創建一個句點列表的方法。我借用@ Fosco的DATEADD方法(thx @Fosco)。

DECLARE @StartDate DATETIME = '06/1/2010'; 

WITH periods AS 
    (SELECT 1 AS period 
    UNION SELECT 2 
    UNION SELECT 3 
    UNION SELECT 4 
    UNION SELECT 5 
    UNION SELECT 6 
    UNION SELECT 7 
    UNION SELECT 8 
    UNION SELECT 9 
    UNION SELECT 10 
    UNION SELECT 11 
    UNION SELECT 12 
    ) 

SELECT period, 
    DATEADD(month,period-1,@StartDate) as startDate, 
    DATEADD(day,-1,DATEADD(month,period,@StartDate)) as endDate 
FROM periods 

有很多方法可以創建您的期間列表。示例請參見this

+0

鮑勃謝謝你的查詢其工作,但我怎麼才能得到只有日期部分?實際上它帶着時間戳來。對不起,要求太多我有一個oracle背景,並且是SQLSERVER的新手。 – user342944 2010-08-20 12:35:00

+0

哦BOB我已經通過Google搜索... 轉換(varchar(10),DATEADD(month,number - 1,@StartDate),105) thankssssssssssssssssssssssssssss – user342944 2010-08-20 12:39:55

1

DATEADD()

select convert(datetime,'6/1/2010') 

select DATEADD(day,-1,DATEADD(month,1,convert(datetime,'6/1/2010'))) --6/30/2010 

select DATEADD(month,1,convert(datetime,'6/1/2010')) --7/1/2010 

你可能會在一個存儲過程,它會生成一個臨時表,或快速和真髒只是一個大的查詢運行這個...

我毫不猶豫地只爲你做這件事,但什麼乾草...

create procedure getFiscalYear 
    @startDate nvarchar(10) 
as begin 

declare @myDate datetime 
set @myDate = convert(datetime,@startDate) 

select 1 as Period, @myDate as startDate, DATEADD(day,-1,DATEADD(month,1,@myDate)) as endDate 
union 
select 2 as Period, DATEADD(month,1,@myDate) as startDate, DATEADD(day,-1,DATEADD(month,2,@myDate)) as endDate 
union 
select 3 as Period, DATEADD(month,2,@myDate) as startDate, DATEADD(day,-1,DATEADD(month,3,@myDate)) as endDate 
union 
select 4 as Period, DATEADD(month,3,@myDate) as startDate, DATEADD(day,-1,DATEADD(month,4,@myDate)) as endDate 
union 
select 5 as Period, DATEADD(month,4,@myDate) as startDate, DATEADD(day,-1,DATEADD(month,5,@myDate)) as endDate 
union 
select 6 as Period, DATEADD(month,5,@myDate) as startDate, DATEADD(day,-1,DATEADD(month,6,@myDate)) as endDate 
union 
select 7 as Period, DATEADD(month,6,@myDate) as startDate, DATEADD(day,-1,DATEADD(month,7,@myDate)) as endDate 
union 
select 8 as Period, DATEADD(month,7,@myDate) as startDate, DATEADD(day,-1,DATEADD(month,8,@myDate)) as endDate 
union 
select 9 as Period, DATEADD(month,8,@myDate) as startDate, DATEADD(day,-1,DATEADD(month,9,@myDate)) as endDate 
union 
select 10 as Period, DATEADD(month,9,@myDate) as startDate, DATEADD(day,-1,DATEADD(month,10,@myDate)) as endDate 
union 
select 11 as Period, DATEADD(month,10,@myDate) as startDate, DATEADD(day,-1,DATEADD(month,11,@myDate)) as endDate 
union 
select 12 as Period, DATEADD(month,11,@myDate) as startDate, DATEADD(day,-1,DATEADD(month,12,@myDate)) as endDate 

end 

這是醜陋的方式...

+0

Fosco感謝您爲回答我的問題所付出的時間和努力...骯髒的方式,但它也有效,但我採取鮑勃的方法。無論如何感謝.. – user342944 2010-08-20 12:35:51