SQL: 判断给定日期是财政年度第几周的函数
2010-07-03 20:49
381 查看
近来单位有个水晶报表涉及到要把原来每个财政年度(上一年的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
于是便写了个函数引入到水晶报表数据源所用到的视图中调用,在此写下以备忘。
代码
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中字符分割,日期判断,以及函数的应用
- javascript 日期判断,今天所在季度,第几周, 季度的第几周,年度第几周,
- sql中计算某天是全年的第几周及取得某天的所在周的周一的日期的函数
- SQL: 判断给定日期值(或时间段)所在星期的星期一和星期天的日期
- SQL 判断给定日期值(或时间段)所在星期的星期一和星期天的日期
- JAVA给定两个日期判断是第几周(中…
- oracle trunc 函数处理日期格式,日期类型很有用的几个sql
- delphi中计算指定日期是该月第几周的函数
- php函数判断给定的两个日期的关系
- 年月日分别是自定义的函数参数,判断是不是正确的日期
- SQL转换日期字段的问题——SQL中CONVERT转化函数的用法
- Delphi实现判断日期的合法性函数
- Mysql 中有关日期的函数(sql)
- MySql判断汉字、日期、数字的具体函数
- Sql判断数据库、表、存储过程、函数是否存在
- SQL判断当前日期是否是周一
- SQL判断两个日期时间区间是否有相交
- SQL中的DateAdd 、DateDiff 函数实现日期加减
- 【Sql】mysql类似to_char()to_date()函数mysql日期和字符相互转换方法date_f