SQL: 判断给定日期是财政年度第几周的函数
近来单位有个水晶报表涉及到要把原来每个财政年度(上一年的6月1号开始到本年的6月30号截止为一个财政年度)按月显示的销售分析表换成按周显示,
于是便写了个函数引入到水晶报表数据源所用到的视图中调用,在此写下以备忘。
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
CREATE FUNCTION [dbo].[WeekOfMonth](@Date DATETIME)
-- @Date 指定的日期
-- 返回 @Ret 此日期是它所在财政年度的第几周,周日是当周的最后一天
RETURNS integer
AS
BEGIN
DECLARE @Year int --取得财政年份
DECLARE @Month int --取得指定日期所在的月份
DECLARE @StWkNumber int --当年的6月1号是当年的第几周
DECLARE @StFinanceDate VARCHAR(10) --财政年度第一天,字符串类
DECLARE @FinanceStarDay DateTime --财政年度第一天,日期类
DECLARE @DayDiff int --取得指定两个日期之间所差的天数
DECLARE @FinanceStarMonday DateTime --财政年度第一天所在那一周周一的日期
DECLARE @Ret int --返回结果
SET @Year =DATEPART(year, @Date) --取得所在年份
SET @Month=DATEPART(month, @Date) --取得所在月份
SET @StFinanceDate= CAST(@Year AS varchar)+'-06-01'
---=======================第一种情况================================
IF (@Month>=6) --如果大于或等于6月,则此日期所在财政年度就在此日期的当年,其所在财政年度第几周直接从本年6月1号起始计算
BEGIN
SET @StWkNumber=DATEPART(WK, convert(datetime,@StFinanceDate,120)) --获取当年6月1号是当年的第几周
SET @Ret=DATEPART(WK, @DATE)-@StWkNumber +1 --计算出指定日期是所属财政年度的第几周
END
---=======================第二种情况================================
IF (@Month<6) --如果小于6月,则此日期所在财政年度起始月分是上一年的6月1号,此日期所在财政年度第几周需要从去年6月1号起始计算
BEGIN
SET @Year = @Year-1 --取得去年年份
SET @StFinanceDate= CAST(@Year AS varchar)+'-06-01' --组合成此日期所在财政年度的第一天时间
SET @FinanceStarDay=convert(datetime,@StFinanceDate,120) --把上面的日期字符串转换成DateTime类型
SET @FinanceStarMonday= DATEADD(wk, DATEDIFF(wk,0,@FinanceStarDay), 0) --取得去年6月1号所在那周的周一是当年几月几号
SET @DayDiff= DATEDIFF(day, convert(datetime,@FinanceStarMonday,120), @Date)+1 --获取这天与去年6月1号所在周的周一之间相差多少天,加1天表示包括当天在内
--分情况计算并返回第几周结果
IF @DayDiff % 7=0 SET @Ret=@DayDiff/7
IF @DayDiff % 7<>0 SET @Ret=@DayDiff/7+1
END
RETURN @Ret
END
-- @Date 指定的日期
-- 返回 @Ret 此日期是它所在财政年度的第几周,周日是当周的最后一天
RETURNS integer
AS
BEGIN
DECLARE @Year int --取得财政年份
DECLARE @Month int --取得指定日期所在的月份
DECLARE @StWkNumber int --当年的6月1号是当年的第几周
DECLARE @StFinanceDate VARCHAR(10) --财政年度第一天,字符串类
DECLARE @FinanceStarDay DateTime --财政年度第一天,日期类
DECLARE @DayDiff int --取得指定两个日期之间所差的天数
DECLARE @FinanceStarMonday DateTime --财政年度第一天所在那一周周一的日期
DECLARE @Ret int --返回结果
SET @Year =DATEPART(year, @Date) --取得所在年份
SET @Month=DATEPART(month, @Date) --取得所在月份
SET @StFinanceDate= CAST(@Year AS varchar)+'-06-01'
---=======================第一种情况================================
IF (@Month>=6) --如果大于或等于6月,则此日期所在财政年度就在此日期的当年,其所在财政年度第几周直接从本年6月1号起始计算
BEGIN
SET @StWkNumber=DATEPART(WK, convert(datetime,@StFinanceDate,120)) --获取当年6月1号是当年的第几周
SET @Ret=DATEPART(WK, @DATE)-@StWkNumber +1 --计算出指定日期是所属财政年度的第几周
END
---=======================第二种情况================================
IF (@Month<6) --如果小于6月,则此日期所在财政年度起始月分是上一年的6月1号,此日期所在财政年度第几周需要从去年6月1号起始计算
BEGIN
SET @Year = @Year-1 --取得去年年份
SET @StFinanceDate= CAST(@Year AS varchar)+'-06-01' --组合成此日期所在财政年度的第一天时间
SET @FinanceStarDay=convert(datetime,@StFinanceDate,120) --把上面的日期字符串转换成DateTime类型
SET @FinanceStarMonday= DATEADD(wk, DATEDIFF(wk,0,@FinanceStarDay), 0) --取得去年6月1号所在那周的周一是当年几月几号
SET @DayDiff= DATEDIFF(day, convert(datetime,@FinanceStarMonday,120), @Date)+1 --获取这天与去年6月1号所在周的周一之间相差多少天,加1天表示包括当天在内
--分情况计算并返回第几周结果
IF @DayDiff % 7=0 SET @Ret=@DayDiff/7
IF @DayDiff % 7<>0 SET @Ret=@DayDiff/7+1
END
RETURN @Ret
END
如何调用:
DECLARE @DATE SMALLDATETIME
DECLARE @RET INT
SET @DATE= '2011-01-01'
SET @RET=dbo.WeekOfMonth(@DATE)
SELECT @RET
DECLARE @RET INT
SET @DATE= '2011-01-01'
SET @RET=dbo.WeekOfMonth(@DATE)
SELECT @RET