2013-04-23 105 views
0

我有一個表格,它包含財務期間的開始日期和結束日期。期間的計算開始日期

CHARGE_PERIOD_ID START_DATE     END_DATE 
13     2013-03-31 00:00:00.000 2013-04-27 00:00:00.000 
14     2013-04-28 00:00:00.000 2013-05-25 00:00:00.000 
15     2013-05-26 00:00:00.000 2013-06-29 00:00:00.000 
16     2013-06-30 00:00:00.000 2013-07-27 00:00:00.000 
17     2013-07-28 00:00:00.000 2013-08-24 00:00:00.000 
18     2013-08-25 00:00:00.000 2013-09-28 00:00:00.000 
19     2013-09-29 00:00:00.000 2013-10-26 00:00:00.000 
20     2013-10-27 00:00:00.000 2013-11-23 00:00:00.000 
21     2013-11-24 00:00:00.000 2013-12-28 00:00:00.000 
22     2013-12-29 00:00:00.000 2014-01-25 00:00:00.000 
23     2014-01-26 00:00:00.000 2014-02-22 00:00:00.000 
24     2014-02-23 00:00:00.000 2014-03-29 00:00:00.000 

報表的用戶希望本財政年度分割成12段,想給在2個參數送入報告,一年將進入我的SQL中的週期數。所以像@ year = 2014 @ period = 1這樣的東西會被收到。我必須寫一些sql來到這張表中,並設定一個週期開始日期爲31/03/2014,週期結束日期爲27/04/2014。

因此,在僞代碼:

查一查1期2014年和返回31/03/2014期的開始日期和27/04/2014結束日期。

@PERIOD_START_DATE =選擇指定年份從3月份開始的第一個期間。所有財務期從三月份開始。

@PERIOD_END_DATE =從表中選擇相應的END_DATE。

問題是如何開始編碼這個或我的設計方法?我是否應該創建一個計算這個函數的函數,或者我應該做一個CTE並添加一個按照他們想要的方式保存期數的列。

想一想更多,我想我需要一個映射表。所以真正的問題是我可以在沒有映射表的情況下執行此操作嗎?

+0

什麼是你的問題? – 2013-04-23 21:16:48

+0

看起來你的日期在2014年3月份會倒退。仔細檢查一下。 – 2013-04-23 21:18:41

+0

好吧,看起來你的時期是從每個月的最後一個星期天到下一個星期的最後一個星期六。那是對的嗎?如果是這樣,您的示例需要更正。 – 2013-04-23 21:22:30

回答

1
DECLARE @Year INT 
DECLARE @Period INT 

SET @Year= 2013 
SET @Period = 1 


;WITH CTE AS 
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY 
           CASE WHEN MONTH([START_DATE])<3 THEN YEAR([START_DATE]) -1 ELSE YEAR([START_DATE]) END        
           ORDER BY 
           CASE WHEN MONTH([START_DATE])<3 THEN YEAR([START_DATE]) - 1 ELSE YEAR([START_DATE]) END 
           ,CASE WHEN MONTH([START_DATE])<3 THEN MONTH([START_DATE]) + 12 ELSE MONTH([START_DATE]) END 
           ) AS RN 
FROM Periods 
) 
SELECT * FROM CTE 
WHERE RN = @Period 
AND CASE WHEN MONTH([START_DATE])<3 THEN YEAR([START_DATE]) -1 ELSE YEAR([START_DATE]) END = @Year 

SQLFiddle DEMO