IF OBJECT_ID('ETLWORK_GETWEEKNUMBER','FN') IS NOT NULL
DROP FUNCTION ETLWORK_GETWEEKNUMBER
GO
--传入日期计算周数
CREATE FUNCTION ETLWORK_GETWEEKNUMBER(@DATE DATETIME)
RETURNS INTEGER
AS
BEGIN
DECLARE @FIRST_DATE_OF_YEAR DATETIME = DATEADD(YYYY,DATEDIFF(YYYY,0,@DATE),0)
-- DECLARE @MONDAY_OF_WEEK DATETIME = DATEADD(WK,DATEDIFF(WK,0,@DATE),0)
-- DECLARE @PREVIOUS_DATE DATETIME = DATEADD(DAY,-1,@DATE)
DECLARE @WEEK_NUMBER INTEGER
-- 如果当前时间是当前年的第一天
IF @DATE = @FIRST_DATE_OF_YEAR
SET @WEEK_NUMBER = 1
-- 星期天是年第一天的情况
ELSE IF (DATEPART(WEEKDAY,@DATE) = 1 AND DATEDIFF(DAYOFYEAR,@FIRST_DATE_OF_YEAR,@DATE)/7 + 1 = DATEPART(WEEK,@DATE))
SET @WEEK_NUMBER = DATEPART(WEEK,@DATE)
-- 星期天不是年第一天的情况
ELSE IF (DATEPART(WEEKDAY,@DATE) = 1 AND DATEDIFF(DAYOFYEAR,@FIRST_DATE_OF_YEAR,@DATE)/7 + 1 <> DATEPART(WEEK,@DATE))
SET @WEEK_NUMBER = DATEPART(WEEK,@DATE) - 1
-- 如果当前天的上一个周日小于年第一天
ELSE IF DATEADD(DAY,-1,DATEADD(WK,DATEDIFF(WK,0,@DATE),0)) < @FIRST_DATE_OF_YEAR
SET @WEEK_NUMBER = 1
-- 当前天前面的一个周日正好是以周日为开始年的 7 倍的天数
ELSE IF DATEDIFF(DAYOFYEAR,@FIRST_DATE_OF_YEAR,DATEADD(DAY,-1,DATEADD(WK,DATEDIFF(WK,0,@DATE),0) ))/7 + 1 = DATEPART(WEEK,@DATE)
SET @WEEK_NUMBER = DATEPART(WEEK,@DATE) + 1
ELSE
SET @WEEK_NUMBER = DATEPART(WEEK,@DATE)
RETURN @WEEK_NUMBER
END
GO
2.传入日期得到周数和周的日期范围
CREATE FUNCTION [dbo].[fn_list_weeks_by_month]
(
@curDate DATE
)
RETURNS
@tmpWeekRange TABLE
(
weekno INT,
month INT,
begindate DATE,
enddate DATE
)
AS
BEGIN
declare @monthFirstDate date,@monthLastDate date,@tmpdate date
--取本月第一天
set @monthFirstDate=DATEADD(DD,-DATEPART(day,@curDate)+1,@curDate)
--取本月最后一天
set @monthLastDate=dateadd(dd,-DatePart(day,dateadd(MM,1,@curDate)),dateadd(MM,1,@curDate))
set @tmpdate=@monthFirstDate
--当所在周超出当月时,函数结束
while(dateadd(dd,-(DatePart(weekday, dateadd(dd,-1,@tmpdate))-1),@tmpdate)<=@monthLastDate)
begin
insert into @tmpWeekRange
values(
dbo.ETLWORK_GETWEEKNUMBER(@tmpdate) --调自定义函数,获取星期一开始的周数
,MONTH(@tmpdate)
,dateadd(dd,-(DatePart(weekday, dateadd(dd,-1,@tmpdate))-1),@tmpdate) --取周第一天
,dateadd(dd,(7-DatePart(weekday, dateadd(dd,-1,@tmpdate))),@tmpdate)) --取周最后一天
--跳到下周
set @tmpdate=DATEADD(DAY,7,@tmpdate)
end
RETURN
END
GO