SQL: 判断给定日期是财政年度第几周的函数

 近来单位有个水晶报表涉及到要把原来每个财政年度(上一年的6月1号开始到本年的6月30号截止为一个财政年度)按月显示的销售分析表换成按周显示,

于是便写了个函数引入到水晶报表数据源所用到的视图中调用,在此写下以备忘。

代码
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

 

如何调用:

DECLARE @DATE SMALLDATETIME
DECLARE @RET INT
SET @DATE
= '2011-01-01'
SET @RET
=dbo.WeekOfMonth(@DATE)
SELECT @RET

 

 

posted @ 2010-07-03 20:49  wsdj  阅读(2411)  评论(0编辑  收藏  举报