我有一张表格,其中包含财务期间的开始日期和结束日期。
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。
所以在伪代码中:
查询2014年的第1期和2014年3月31日的回收期开始日期以及2014年4月27日的期末结束日期。
@PERIOD_START_DATE =选择在给定年份的3月份开始的第一个期间。所有财政期间从3月开始。
@PERIOD_END_DATE =从表中选择相应的END_DATE。
问题是如何开始编码这个或我的设计方法?我应该创建一个计算这个的函数,还是应该进行CTE并添加一个列,以便按照他们想要的方式保存句号等。
考虑更多我认为我需要一个映射表。所以真正的问题是我可以在没有映射表的情况下这样做吗?
答案 0 :(得分: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 强>