2013-04-23 83 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

相关问题