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

 

 

你可能感兴趣的:(sql)